xpath表达式可以多次选择相同的父节点

时间:2012-10-02 22:00:38

标签: xpath xpath-1.0

我有一些像这样的HTML:

<tr class="odd">
  <td class="player large-link">
    <a name="some name"/> <!-- I want to return this but two times. -->
  </td>
  <td class="bookings">
    <span/>
    <span/>
  </td>
</tr>

可以根据两个<a name="some name"/>两次返回<span/>元素吗?  抱歉我的英语。

3 个答案:

答案 0 :(得分:1)

在XPath 1中这是不可能的,但在XPath 2中你可以使用for..in..return:

for $s in tr/td[@class="bookings"]/span return $s/../preceding-sibling::td/a

(假设html解析器已插入关闭td,span标记,因此td成为前一个元素,而不是父元素)

答案 1 :(得分:1)

XPath 1.0使用节点集的概念,而XPath 2.0使用序列。节点集是真集,因此您不能将同一节点作为节点集的成员两次。但是,您可以执行下一个最好的操作,即迭代已标识的span节点集并使用更高级别的语言,然后对a节点上的每个span节点执行一些操作。 / p>

实施例

例如,假设您在XSLT中使用XPath。然后,XSLT 1.0样式表的这个片段将在a节点上执行一些操作,就像您拥有span个节点一样多。此片段假定在进入时,焦点节点是tr节点的父节点。

<xsl:for-each select="tr/td[@class="bookings"]/span">
  <xsl:for-each select="(../../td[@class='player large-link']/a[name='@some name'])[1]">
    <!-- The `a` node is now the focus node. -->
    <!-- Insert desired action here on the focus node. -->
  </xsl:for-each>
</xsl:for-each> 

答案 2 :(得分:1)

  

可以两次返回<a name="some name"/>元素   两个<span/>

不使用单个XPath 1.0表达式 - XPath 1.0表达式选择的节点形成一个所谓的“节点集” - 这是一个真正的集合 - 它被重复数据删除。

在Xpath 2.0中,可以构建节点的序列,并且序列可以多次包含同一节点:

/*/*/a[@name='some name']/*[1]/.., /*/*/a[@name='some name']/*[2]/..

上面的XPath 2.0表达式指定了一个包含两个想要的相同元素的序列。