我有一些像这样的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/>
元素吗?
抱歉我的英语。
答案 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表达式指定了一个包含两个想要的相同元素的序列。