1

我有一些类似这样的 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/>?对不起我的英语。

4

3 回答 3

1

XPath 1.0 使用节点集的概念,而 XPath 2.0 使用序列。节点集是真正的集,所以你不能让同一个节点成为节点集的成员两次。但是,您可以做下一个最好的事情,即迭代一组已识别span节点并使用您的高级语言,然后对节点上的每个跨度节点执行一些操作a

例子

例如,假设您在 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> 
于 2012-10-03T03:46:01.807 回答
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 表达式指定了一个包含两个想要的相同元素的序列。

于 2012-10-03T04:16:34.067 回答
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 成为前面的元素,而不是父元素)

于 2012-10-02T22:19:31.170 回答