kra*_*aya 13 xml xslt xpath nodes
XML片段:
<AA>
<BB>foo</BB>
<CC>bar</CC>
<DD>baz</DD>
<EE>bar</EE>
</AA>
Run Code Online (Sandbox Code Playgroud)
如何选择<AA>具有bar其内容的所有子节点?在上面的例子中,我想选择<CC>和<EE>.我认为解决方案是这样的:
<xsl:template match="AA">
<xsl:for-each select="???" />
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
Dim*_*hev 27
OP问题最简单的解决方案之一是以下XPath表达式:
*/*[.='bar']
Run Code Online (Sandbox Code Playgroud)
请注意,不涉及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>
Run Code Online (Sandbox Code Playgroud)
在原始XML文档上应用此转换时:
<AA>
<BB>foo</BB>
<CC>bar</CC>
<DD>baz</DD>
<EE>bar</EE>
</AA>
Run Code Online (Sandbox Code Playgroud)
产生了想要的结果:
<AA>
<CC>bar</CC>
<EE>bar</EE>
</AA>
Run Code Online (Sandbox Code Playgroud)
请注意:
在匹配模式中,我们通常不需要指定绝对XPath表达式,而只需指定相对的表达式,因此完整的XPath表达式自然简化为此匹配模式:
*[. = 'bar']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24081 次 |
| 最近记录: |