tac*_*ach 2 xml xpath ancestor
我想有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>
Run Code Online (Sandbox Code Playgroud)
我想选择文档中没有作为祖先节点的所有b节点// a/c/a [1].
我想选择文档中没有作为祖先节点的所有b节点
//a/c/a[1]
使用此XPath表达式:
//b[not(ancestor::a
[parent::c[parent::a]
and
not(preceding-sibling::a)
]
)
]
Run Code Online (Sandbox Code Playgroud)
这将选择b文档中没有祖先的所有元素,这些元素a的父级c具有父级a ,父级的a祖先c不是其父级的第一a个子级.
给出以下XML文档(基于提供的,但是在应该选择的节点中制作格式良好并且还要标识文本):
<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>
Run Code Online (Sandbox Code Playgroud)
确切地选择了想要的6个b元素.
使用XSLT进行验证:
<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>
Run Code Online (Sandbox Code Playgroud)
当此转换应用于上述XML文档时,将精确b选择所需元素并将其复制到输出中.产生了想要的正确结果:
<b>This node 1</b>
<b>This node 2</b>
<b>This node 3</b>
<b>This node 4</b>
<b>This node 5</b>
<b>This node 6</b>
Run Code Online (Sandbox Code Playgroud)