2012-09-20 60 views
1

我正在努力理解XSLT轉換。目前,我收到一個XML格式的序列化對象,然後應用XSLT並將新的XML發送回該程序。但是現在我需要消除XSLT步驟並在程序中進行內部轉換。問題是我第二次見過XSLT表。轉換表看起來非常簡單,但我仍然無法忽略那裏正在發生的事情。將XSLT轉換爲C#

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://tempuri.org/"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template name="CopyEverything" match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/t:Data/Flagged"> 
    <xsl:element name="Flagged"> 
     <xsl:apply-templates select="/t:Data/Covers/node()|@*"/> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template match="/t:Data/FlaggedDetails"> 
    <xsl:element name="FlaggedDetails"> 
     <xsl:apply-templates select="/t:Data/TotalFlaggedDetails/node()|@*"/> 
    </xsl:element> 
    </xsl:template> 
    <xsl:template match="/t:Data/System/RArray"> 
    <xsl:element name="{local-name()}"> 
     <xsl:for-each select="/t:Data/System/RArray/Elem"> 
     <xsl:call-template name="CopyEverything"/> 
     </xsl:for-each> 
     <xsl:for-each select="/t:Data/Elem/Elem"> 
     <xsl:variable name="currentCode" select="Code" /> 
     <xsl:variable name="showAlways" select="ShowAlways" /> 
     <xsl:if test="count(/t:Data/System/RArray/Elem[Code=$currentCode])=0"> 
      <xsl:call-template name="CopyEverything"/> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

據我瞭解,從數據/標記,並且數據/ FlaggedDetails東西被複制到數據/系統/的RArray,我不能把這種邏輯爲C#。我不得不消除序列化詞彙表,因此我在不使用XSLT的情況下在集合之間移動對象(如果發生了這種情況)。有人可以幫助我嗎?

回答

2

我不會建議「翻譯」 XSLT轉換成C#的原因有很多

這並不總是容易的,因爲兩種語言之間的不兼容性:

  1. 想想如何模擬C#中的模板並匹配模式?

  2. 如何模擬XSLT處理模型?

  3. 如何模擬導入樣式表模塊並確定具有最高導入優先級的對象?

  4. 如何模擬鍵?

  5. 你將不得不實施一些C#有用的XPath(和XSLT)標準功能 - 所有的字符串函數,例如translate()normalize-space()substring-before()substring-after(),......等等

  6. 指令如<xsl:number>和功能如format-number()

所以,如果你投資於這一切所需要的時間,結果是成功(這是不是太可能),翻譯將是幾比原來在大多數情況下更長的時間 - 完全不可理解,不可擴展,不可維護。

我還懷疑翻譯的運行速度會比原文快得多 - 在某些情況下它可能運行速度較慢(例如,不能有效實現密鑰)。

結論:我強烈建議不要參與這種破壞性活動。