2017-08-22 112 views
0

我有兩個可能的XML文件:如何在填充某個其他屬性時使用XSLT替換XML屬性?

<orders> 
    <order id="1"> 
     <code value="001-AAA"/> 
     <altCode value="002-BBB"/> 
    </order> 
</orders> 

和:

<orders> 
    <order id="2"> 
     <code value="001-AAA"/> 
     <altCode value=""/> 
    </order> 
</orders> 

我想<code>標籤的value屬性由<altCode>標籤的value屬性所取代,除非第二個值是空的。在那種情況下,我希望XML te保持不變。 <altCode>標籤不需要更改。

所以導致兩個XML文件應該是這樣的:

<orders> 
    <order id="1"> 
     <code value="002-BBB"/> 
     <altCode value="002-BBB"/> 
    </order> 
</orders> 

和:

<orders> 
    <order id="2"> 
     <code value="001-AAA"/> 
     <altCode value=""/> 
    </order> 
</orders> 

注: 實際的文件,我想轉換是一個複雜得多。所以我更喜歡複製模板並在使用when語句後更改屬性。

任何幫助,非常感謝。

+0

「*我喜歡用時語句後複製的模板,並更改屬性*。」什麼模板?你沒有顯示任何模板,我們不知道它匹配什麼,這是至關重要的。 –

回答

2

我會建議你做:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="code/@value[string(../../altCode/@value)]"> 
    <xsl:copy-of select="../../altCode/@value"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

謝謝Michael!而已。我得到了大部分,但被卡在最後一部分。你能解釋那部分嗎? ' 我知道@ -part,但是'[]',字符串和'../'對我來說是未知的。幾天前剛剛開始XSLT。 –

+0

@CananIppel第二個模板在[predicate]部分表達的條件中匹配'code'的'value'屬性。當兄弟的「altCode/@ value」不是空字符串時,謂詞的計算結果爲true。否則,該屬性將按照第一個模板的原樣進行復制。 '../'表示上升到父級。 –