XML 片段:
<AA>
<BB>foo</BB>
<CC>bar</CC>
<DD>baz</DD>
<EE>bar</EE>
</AA>
如何选择 <AA>
的所有子节点?有 bar
作为其内容?在上面的示例中,我想选择 <CC>
和 <EE>
.我认为解决方案是这样的:
<xsl:template match="AA">
<xsl:for-each select="???" />
</xsl:template>
最佳答案
OP 问题的最简单解决方案之一是以下 XPath 表达式:
*/*[.='bar']
请注意,不涉及任何 XSLT 指令——这只是一个 XPath 表达式,因此该问题只能标记为 XPath。
从这里开始,您可以通过多种方式在 XSLT 中使用此 XPath 表达式,例如在所有选定节点上应用模板。
例如,下面是一个 XSLT 转换,它采用 XML 文档并生成另一个文档,其中所有元素 - <AA>
的子元素其内容不等于"bar"
被删除:
<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="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AA">
<xsl:copy>
<xsl:apply-templates select="*[. = 'bar']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当此转换应用于原始 XML 文档时:
<AA>
<BB>foo</BB>
<CC>bar</CC>
<DD>baz</DD>
<EE>bar</EE>
</AA>
产生了想要的结果:
<AA>
<CC>bar</CC>
<EE>bar</EE>
</AA>
请注意:
在匹配模式中,我们通常不需要指定绝对 XPath 表达式,而只需指定相对表达式,因此完整的 XPath 表达式自然会简化为此匹配模式:
*[. = 'bar']
关于xml - 根据内容选择子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/718531/