2016-03-01 107 views
0

我使用這個XSL來改變一些XML的兩個標籤更改標籤的價值只有在另外的標籤有

XSL的特定值

xsltproc - "filename" << EOF 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="no"/> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="root/attr1/text()"> 
     <xsl:text>new-text</xsl:text> 
    </xsl:template> 
    <xsl:template match="root/group1/attr1/text()"> 
     <xsl:text>another-new-text</xsl:text> 
    </xsl:template> 
    </xsl:stylesheet> 
EOF 

XML

<root> 
    <attr1>someold</attr1> 
    <group1> 
    <attr1>anotherold</attr1> 
    </group1> 
    <attr2>0</attr2> 
</root> 

輸出

<root> 
    <attr1>new-text</attr1> 
    <group1> 
    <attr1>another-new-text</attr1> 
    </group1> 
    <attr2>0</attr2> 
</root> 

這個xsl非常適合我的需求,但現在我需要在轉換之前驗證attr2。如果attr20我需要改變,否則我應該離開舊值。

我有數百個xml轉換,每一個都有數百行,因此我正在尋找一種自動方式來驗證。我嘗試了xsl:if,但找不到放置標籤的位置以及如何構建test屬性。

如何僅在其他標籤具有特定值時更改標籤的值?對xsl的其他改進也是值得歡迎的。

回答

1

您可以在匹配模式中添加條件,例如, <xsl:template match="root[attr2 = 0]/attr1/text()">...</xsl:match>和/或<xsl:template match="root[attr2 = 0]/group1/attr1/text()">

+0

是否有辦法來驗證'attR2位= 0'只是一次? –

+0

不在基於模板的方法中,如果您需要兩個帶有檢查但內容不同的模板。 –

0

你可以採取attR2位爲變量和使用變量來驗證您的條件.....

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="no"/> 
<xsl:variable name="attr2" select="root/attr2 "/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="root/attr1/text()"> 

<xsl:value-of select="."/> 

</xsl:when> 
<xsl:otherwise> 
    <xsl:text>new-text</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
<xsl:template match="root/group1/attr1/text()"> 
    <xsl:text>another-new-text</xsl:text> 
</xsl:template> 

+0

你的xsl中缺少什麼? –