2013-06-23 30 views
1

我將要變換的節點,如:合併兩個節點爲一體,以從一個值名稱從其他節點

<Element> 
     <Type>Type1</Type> 
     <Quantity>q1</Quantity> 
</Element> 

(類型節點的價值來自於一個枚舉)爲:

<Element> 
    <Type1>q1</Type1> 
</Element> 

只有在兩個節點都存在的情況下。否則,如果節點<Quantity>不存在,但節點<LastDate>存在代替,那麼這個節點:

<Element> 
    <Type>Date</Type> 
    <LastDate>date string</LastDate> 
</Element> 

變爲:

<Element> 
    <Date>date string</Date> 
</Element> 

所以新節點的名稱始終從<Type>值取節點,但其值可能來自父節點<Element>的不同子節點(當它們存在時)。包含該值的子節點會在最終輸出中被刪除,以及<Type>節點。

我沒有問題在Linq中這樣做XML C#代碼。但是,由於這種轉換可以應用於多個不同的節點,因此,指向我的程序的命令行輸入,指定哪些節點受到影響以及如何變得複雜。

與此相反,xslt具有爲簡單轉換進行自記錄的附加價值。

回答

3

使用<xsl:element>來創造一個無與倫比的元素。

所以,你需要這樣的東西(錯別字未測試):

<xsl:template match="Element"> 
    <xsl:copy> 
     <xsl:element name="{Type}"> 
     <xsl:copy-of select="(Quantity|LastDate)/node()"/> 
     </xsl:element> 
    </xsl:copy> 
    </xsl:template> 

這段代碼複製<Element>元素,然後使用子元素<Type>的內容的名稱創建子元素憑空。

使用大括號是一個屬性值模板,其中的XPath地址就像<xsl:value-of>指令那樣進行評估。

+0

Thx,讓我測試它。 – Tony

+0

按預期工作,並將接受它作爲答案。我只需要一點額外的幫助,關於我在OP中未提及的細節。元素節點有其他節點,應該像這樣保存。 – Tony

+0

好吧,算出來。只需要添加一個額外的複製語句: ''但是想知道是否可以複製Element的所有其他子節點而不明確地枚舉它們。 – Tony

相關問題