仅当另一个标记具有特定值

时间:2016-03-01 13:51:02

标签: xslt

我使用这个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的其他改进也很受欢迎。

2 个答案:

答案 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>