XPath 1.0 - 选择不同节点深度的文本

时间:2014-02-10 17:40:41

标签: xpath

我在这里发帖是为了让专家知道如何最好地组合来自不同节点深度的文本值以及索引的文本值。

我试图找出如何从以下两个语句创建单个XPath 1.0语句。文本值位于不同的深度,第二个语句具有索引文本值。

我想要合并的两条路径如下:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/a/text()
div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/text()[2]

其所在的上下文是评论海报将其名称作为锚点(从中联系)或仅仅是纯文本。

第一个语句中选择的文本来自没有任何嵌套文本的锚点。在第二个语句中选择的文本需要索引作为相邻或嵌套文本存在,因此必须明确提供。

非常感谢有关此事的任何建议或指导。

谢谢你, 迈克尔

修改/后随

下面的摘录显示了HTML(仅标记)的精简版本,但保留了特定div的类值。原始问题中提供的XPath值对应于下面li项中的XPath查询:

<html>
  <body>
    <div>
      <div>
        <div>
          <ol>
            <li>
              <div>
                <div class="comment-author vcard">
                  <a>candaceerin</a>
                  <div class="commentmetadata">...</div>
                </div>
              </div>
            </li>
            <li>
              <div>
                <div class="comment-author vcard">
                  <img/> Rachel
                  <div class="commentmetadata">...</div>
                </div>
              </div>
            </li>
          </ol>
        </div>
      </div>
    </div>
  </body>
</html>

2 个答案:

答案 0 :(得分:0)

使用union operator |将它们合并为一个XPath语句:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/a/text() |
 div/div[contains(concat(' ', @class, ' '), ' comment-author ')]/text()[2]

以下XPath表达式也可能有效,但它们很难看:

选项1:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]//text()
  [(parent::div and position()=2) or parent::a[parent::div]]

选项2:

div/div[contains(concat(' ', @class, ' '), ' comment-author ')]//text()
  [
   (parent::div[contains(concat(' ', @class, ' '), ' comment-author ')]/parent::div 
    and position()=2 ) 
   or parent::a[div[contains(concat(' ', @class, ' '), ' comment-author ')]/parent::div]
  ]

答案 1 :(得分:0)

您应该编辑您的答案,以显示HTML的相关部分,而不是仅仅链接到评论中的整页。你已经熟悉了结构,但我们需要花费时间和精力去那里看看你在谈论什么。此外,您的问题对于可能遇到同样问题的其他人来说并不是真的有用。

无论如何,这个XPath应该抓住你想要的东西:

  

// div [contains(@class,'comment-author')] // text()[normalize-space()而不是(ancestor :: div [@ class =“commentmetadata”])]

//div[contains(@class, 'comment-author')]选择带有评论的div,然后尝试使用//text()捕获所有文本。之后,您需要使用normalize-space()检查文本字符串是否为空,字符串不是注释的日期,该日期在<div class="commentmetadata"">中给出。