通过特定的类或id获取大多数内部div

时间:2013-01-14 20:23:55

标签: html xpath

我想在包含“内容”的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。

谢谢!

3 个答案:

答案 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>