我想选择文档中没有作为其祖先节点的所有 b 节点//a/c/a[1]
使用这个 XPath 表达式:
//b[not(ancestor::a
[parent::c[parent::a]
and
not(preceding-sibling::a)
]
)
]
这将选择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>
正好选择了想要的 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>
当对上述 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>