此答案仅使用 XPath 1.0 表达式。我的理解是 XPath 2.0 不可用。
使用:
//div[contains(@id, 'Content') or contains(@class, 'Content')]
[not(descendant::div[contains(@id, 'Content') or contains(@class, 'Content')])]
这将选择其属性具有包含 string 的 string 值的任何元素div
,或者其属性具有包含 string 的 string 值并且没有具有此属性的后代元素的任何元素。id
"content"
class
"content"
div
请注意,诸如“最内部的 div”之类的东西可能不是单数的——也就是说,div
可能存在许多元素以满足问题中设置的条件。
如果是这种情况,并且您只需要一个这样div
的元素(例如,第一个元素),您可以使用:
(//div[contains(@id, 'content') or contains(@class, 'content')]
[not(descendant::div[contains(@id, 'content') or contains(@class, 'content')])]
)[1]
基于 XSLT 的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"//div[contains(@id, 'Content') or contains(@class, 'Content')]
[not(descendant::div[contains(@id, 'Content') or contains(@class, 'Content')])]"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于第一个提供的 XML 文档时:
<body>
<div class="outerContent">
<div id="moreContent">
<div class="anotherContent">
This is what I am looking for.
</div>
</div>
</div>
</body>
计算 Xpath 表达式,并将计算结果复制到输出:
<div class="anotherContent">
This is what I am looking for.
</div>
使用第二个文档,再次产生正确的结果:
<div id="anotherContent">
This is what I am looking for.
</div>
最后,如果“内容”的比较应该不区分大小写,请使用:
//div[contains(translate(@id,'CONTE','conte'), 'content')
or contains(translate(@class,'CONTE','conte'), 'content')
]
[not(descendant::div
[contains(translate(@id,'CONTE','conte'), 'content')
or contains(translate(@class,'CONTE','conte'), 'content')
]
)
]