我想在包含“内容”的id或类的html文档中找到大多数内部div。
我尝试过:
//div[@id[contains(.,'content') and not(*)]]
这适用于获取包含“内容”的id的最内部div。
现在我希望通过包含id或类“content”的id或class(取决于最内在的是什么)获得最内在的div。
示例数据:
<body>
<div class="outerContent">
<div id="moreContent">
<div class="anotherContent">
This is what I am looking for.
</div>
</div>
</div>
</body>
或
<body>
<div class="outerContent">
<div id="moreContent">
<div id="anotherContent">
This is what I am looking for.
</div>
</div>
</div>
</body>
请注意,“这就是我要找的东西”可以在div类中包含“内容”或包含“内容”的div ID。
谢谢!
答案 0 :(得分:0)
<强>更新强>
如果我正确理解您的问题,我就会这样做://descendant::div[last()][contains(@id,'Content')]
如果您在任何情况下需要检查@id,请使用@id
部分周围的translate function。
答案 1 :(得分:0)
我对你的确切问题并不完全清楚,所以我给出了两种解释。
<div/>
个元素符合谓词 <div/>
@class
或@id
包含“内容”,其中不包含任何其他<div/>
来完成此谓词。这允许<div/>
内的其他标记。
//descendant::div
(: either @id or @class contain 'content' :)
[contains(lower-case(@id), 'content') or contains(lower-case(@class), 'content')]
(: only inner-most div fulfilling this condition :)
[last()]
<div/>
中不得有任何元素节点。
//descendant::*
(: only inner-most elements :)
[last()]
(: which are a div :)
[local-name(.) eq 'div']
(: and either @id or @class contain 'content' :)
[contains(lower-case(@id), 'content') or contains(lower-case(@class), 'content')]
如果您没有XQuery 2.0支持,则不应该有任何fn:lower-case()
可用。如果是这样,您将不得不剥离它,并将“内容”替换为您提供的数据的“内容”。
如果你有XQuery 2.0支持,你也可以使用它作为一个更具可扩展性的谓词(更容易将新属性添加到列表中并减少冗余代码):
[some $attribute in (@id, @class) satisfies contains(lower-case($attribute), 'content')]
答案 2 :(得分:0)
此答案仅使用XPath 1.0表达式。我的理解是XPath 2.0不可用。
使用强>:
//div[contains(@id, 'Content') or contains(@class, 'Content')]
[not(descendant::div[contains(@id, 'Content') or contains(@class, 'Content')])]
这将选择任何div
元素,其id
属性的字符串值包含字符串"content"
,或其class
属性的字符串值包含字符串{{1并且没有具有此属性的后代"content"
元素。
请注意,“最内在的div”之类的东西可能不是单数 - 也就是说,可能存在许多div
个元素,使它们满足在问题
如果是这种情况,并且您只需要一个div
元素(例如,第1个),则可以使用:
div
基于XSLT的验证:
(//div[contains(@id, 'content') or contains(@class, 'content')]
[not(descendant::div[contains(@id, 'content') or contains(@class, 'content')])]
)[1]
在第一个提供的XML文档上应用此转换时:
<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>
评估Xpath表达式并将此评估结果复制到输出中:
<body>
<div class="outerContent">
<div id="moreContent">
<div class="anotherContent">
This is what I am looking for.
</div>
</div>
</div>
</body>
使用第二个文档,再次生成正确的结果:
<div class="anotherContent">
This is what I am looking for.
</div>
最后,如果“内容”的比较应该是不区分大小写的,请使用:
<div id="anotherContent">
This is what I am looking for.
</div>