Xml XSLT2.0基于属性名删除元素,并添加一组元素
考虑下面的XMLXml XSLT2.0基于属性名删除元素,并添加一组元素,xml,xslt,Xml,Xslt,考虑下面的XML <?xml version="1.0" encoding="UTF-8"?> <p > <node> <e a="1"/> <e a="2"/> </node> <a> <c value="-3" v="RRR_1"/> <c value="1" v="RRR_2"/> <c value="11" v="v1"/&
<?xml version="1.0" encoding="UTF-8"?>
<p >
<node>
<e a="1"/>
<e a="2"/>
</node>
<a>
<c value="-3" v="RRR_1"/>
<c value="1" v="RRR_2"/>
<c value="11" v="v1"/>
<c value="12" v="v2"/>
</a>
</p>
我想找到所有的c元素,它们的v属性值以RRR开头,并将它们删除
然后我想在末尾附加以下c节点
<c value="123" v="RRR_134"/>
<c value="456" v="RRR_233"/>
<c value="789" v="RRR_900"/>
最后的XML看起来像
<?xml version="1.0" encoding="UTF-8"?>
<p >
<node>
<e a="1"/>
<e a="2"/>
</node>
<a>
<c value="11" v="v1"/>
<c value="12" v="v2"/>
<c value="123" v="RRR_134"/>
<c value="456" v="RRR_233"/>
<c value="789" v="RRR_900"/>
</a>
</p>
我编写了以下XSL来删除以RRR开头的具有v属性的c节点,但是如何更改相同的XSL以在末尾添加所需的元素。我可以编写另一个XSL表来完成这项工作,但我想知道是否可以在同一个XSLT文件中完成这项工作
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/p/a/c[starts-with(@v, 'RRR')]"></xsl:template>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- remove new lines for a deleted element -->
<xsl:template match="*/text()[normalize-space()]">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
</xsl:stylesheet>
一种可能的解决方案是在最后一个
c
元素之后添加节点,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/p/a/c[starts-with(@v, 'RRR')]"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="c[position()=last()]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<c value="123" v="RRR_134"/>
<c value="456" v="RRR_233"/>
<c value="789" v="RRR_900"/>
</xsl:template>
</xsl:stylesheet>
当应用于输入XML时,将生成输出:
<?xml version="1.0" encoding="UTF-8"?>
<p>
<node>
<e a="1"/>
<e a="2"/>
</node>
<a>
<c value="11" v="v1"/>
<c value="12" v="v2"/>
<c value="123" v="RRR_134"/>
<c value="456" v="RRR_233"/>
<c value="789" v="RRR_900"/>
</a>
</p>
我还删除了模板以删除已删除元素的换行符,并添加了
和属性为indent=“yes”
的xsl:output
,以生成缩进输出。匹配最后一个
c
元素的模板复制此元素,然后只写入附加的c
节点