使用xslt添加和删除子元素



我有以下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有什么问题?

如果您想替换rules下的所有rule元素,那么只需要一个匹配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元素,那么您可以将xsl:apply-templates添加到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="@*|node()"/>            
            <rule>
                <name>zz</name>
            </rule>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="rule[name='aa']"/>
    <xsl:template match="rule[name='bb']"/>
    <xsl:template match="rule[name='cc']"/>
</xsl:stylesheet>

由于XSL是功能性的,您定义的所有操作都发生在原始文档上。这并不是说你先删除一个规则,然后再删除另一个规则等,你只是定义了一个将应用于原始文档的函数。最后一个模板将匹配的节点转换为相同的节点(复制操作)和新元素。

相关内容

  • 没有找到相关文章

最新更新