我有以下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
元素要保留,除了aa
、bb
和cc
元素,那么您可以将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是功能性的,您定义的所有操作都发生在原始文档上。这并不是说你先删除一个规则,然后再删除另一个规则等,你只是定义了一个将应用于原始文档的函数。最后一个模板将匹配的节点转换为相同的节点(复制操作)和新元素。