题
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']
不隶属于 StackOverflow