如果我有一个看起来像这样的XML节点
<node name="a">
<element ref="bb" />
<element ref="cc" />
<element ref="prefix_dd" />
<element ref="prefix_ee" />
</node>
我想编写一个XSLT来返回
<node name="a">
<element ref="prefix_dd" />
<element ref="prefix_ee" />
</node>
答案 0 :(得分:2)
您可以使用身份规则模板和一个模板来“切断”不需要的元素。
示例:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="element[
not(
starts-with(@ref,'prefix_')
)
]"/>
</xsl:stylesheet>
答案 1 :(得分:1)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/node">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="element[starts-with(@ref, 'prefix_')]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:1)
可能是最短的转换之一:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()[not(@ref[not(starts-with(.,'prefix_'))])]|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<node name="a">
<element ref="bb" />
<element ref="cc" />
<element ref="prefix_dd" />
<element ref="prefix_ee" />
</node>
产生了想要的正确结果:
<node name="a">
<element ref="prefix_dd"/>
<element ref="prefix_ee"/>
</node>
解释:修改后的身份规则。