使用xslt添加和删除子元素

时间:2015-11-27 06:37:39

标签: xml xslt xslt-1.0

我有以下xml文件

<rules>
  <rule>
    <name>aa</name>
  </rule>

    <rule>
    <name>cc</name>
  </rule>

  <rule>
     <name>bb</name>
  </rule>

 </rules>

我想删除现有的3条规则,而是添加新规则

 <rule>
     <name>zz</name>
  </rule>

所以输出应该是

<rules>
    <rule>
        <name>zz</name>
    </rule>
</rules>

我试过这个xslt,

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>


    <xsl:template match="rule[name[text()='aa']]"/>
    <xsl:template match="rule[name[text()='bb']]"/>

    <xsl:template match="rule[name[text()='cc']]"/>


    <xsl:template match="rule[position()=last()]">
        <xsl:copy-of select="."/>
        <rule>
            <name>zz</name>
        </rule>
    </xsl:template>


</xsl:stylesheet>

但它产生了这个 - (cc未被删除)

<rules>
    <rule>
        <name>cc</name>
    </rule>
    <rule>
        <name>zz</name>
    </rule>

</rules>

xslt有什么问题?

2 个答案:

答案 0 :(得分:1)

如果您想要替换rule下的所有rules元素,那么只需要一个匹配rules的模板,输出新规则的模板就可以更简单了。选择其他任何东西。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="rules">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>            
            <rule>
                <name>zz</name>
            </rule>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

或者,如果您要保留其他rule个元素,其他aabbcc元素,则可以添加{{1 } {} xsl:apply-templates模板,并让您的其他匹配模板忽略它们

rules

答案 1 :(得分:0)

由于XSL正常运行,您定义的所有操作都会在原始文档上发生。它不像你删除一个规则然后另一个规则等,你只需定义一个将应用于原始文档的函数。您的上一个模板会将匹配的节点转换为相同的节点(复制操作)和新元素。