我使用这个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
。如果attr2
是0
我需要更改,否则我应该保留旧值。
我有数百个xml要转换,每个都有数百行,因此我正在寻找一种自动验证方法。我尝试了xsl:if
,但无法确定标记的放置位置以及如何构建test
属性。
如果另一个标签具有特定值,如何更改标签的值? xsl的其他改进也很受欢迎。
答案 0 :(得分:1)
您可以在匹配模式中添加条件,例如<xsl:template match="root[attr2 = 0]/attr1/text()">...</xsl:match>
和/或<xsl:template match="root[attr2 = 0]/group1/attr1/text()">
。
答案 1 :(得分: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>