我有以下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有什么问题?
答案 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
个元素,其他aa
,bb
和cc
元素,则可以添加{{1 } {} xsl:apply-templates
模板,并让您的其他匹配模板忽略它们
rules
答案 1 :(得分:0)
由于XSL正常运行,您定义的所有操作都会在原始文档上发生。它不像你删除一个规则然后另一个规则等,你只需定义一个将应用于原始文档的函数。您的上一个模板会将匹配的节点转换为相同的节点(复制操作)和新元素。