1

我想在具有包含“内容”的 id 或类的 html 文档中访问大多数内部 div。

我试过的:

//div[@id[contains(.,'content') and not(*)]]

这适用于获取具有包含“内容”的 id 的最内部 div。

现在我想通过包含 id 或类“内容”的 id 或类(取决于最内部的是什么)来获取最内部的 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 中。

谢谢!

4

3 回答 3

0

更新。

如果我正确理解您的问题,我会这样做://descendant::div[last()][contains(@id,'Content')]

如果您需要在任何情况下检查@id,请在部件周围使用翻译功能@id

于 2013-01-14T20:53:56.183 回答
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')]
于 2013-01-15T00:43:31.193 回答
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')])]

这将选择其属性具有包含 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')
               ]
              )
         ] 
于 2013-01-15T01:30:29.753 回答