我想拥有xpath,它获取没有祖先的节点,祖先是特定节点的第一个后代。
我们假设我们有这样的xml文档:
<a>
<b>This node</b>
<c>
<a>
<b>not this</b>
<g>
<b>not this</b>
</g>
</a>
<a>
<b>This node</b>
<c/>
</a>
</c>
</a>
<a>
<c>
<a>
<b>not this</b>
</a>
<a>
<b>This node</b>
</a>
<a>
<b>This node</b>
</a>
<a>
<b>This node</b>
</a>
</c>
</a>
<d>
<b>This node</b>
</d>
我想选择文档中没有作为祖先节点的所有b节点// a / c / a [1]。
答案 0 :(得分:8)
我想选择所有b节点 没有他们的文件 祖先节点
//a/c/a[1]
使用此XPath表达式:
//b[not(ancestor::a
[parent::c[parent::a]
and
not(preceding-sibling::a)
]
)
]
这将选择文档中没有祖先b
的所有a
个元素,这些元素的父级c
具有父级a
和父a
的{{1}}祖先不是其父级的第一个c
子级。
鉴于以下XML文档(基于提供的,但在格式良好且在应该选择的节点中放置标识文本):
a
确切地选择了想要的6个<t>
<a>
<b>This node 1</b>
<c>
<a>
<b>not this</b>
<g>
<b>not this</b>
</g>
</a>
<a>
<b>This node 2</b>
<c/>
</a>
</c>
</a>
<a>
<c>
<a>
<b>not this</b>
</a>
<a>
<b>This node 3</b>
</a>
<a>
<b>This node 4</b>
</a>
<a>
<b>This node 5</b>
</a>
</c>
</a>
<d>
<b>This node 6</b>
</d>
</t>
元素。
使用XSLT进行验证:
b
当对上述XML文档应用此转换时,会精确选择所需的<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="/">
<xsl:copy-of select=
"//b[not(ancestor::a
[parent::c[parent::a]
and
not(preceding-sibling::a)
]
)
]
"/>
</xsl:template>
</xsl:stylesheet>
元素并将其复制到输出中。产生了想要的正确结果:
b