如果我有两个链接:
<div class="abc">
<a id="def1" href="/definitely">Definitely 1</a>
<a id="def2" href="/definitely">Definitely 2</a>
</div>
我想确定第一个(def1
),我认为这样可行:
var linkXPath = "//div[@class='abc']//a[contains(@href,'def')][1]";
但它似乎没有。
我做错了什么?
答案 0 :(得分:4)
这是一个常见问题解答为什么
//someName[1]
未选择//someName
的第一个元素。
查看 the definition of the //
abbreviation ,实际上会意识到
//someName[1]
相当于:
/descendant-or-self::node()/someName[1]
并选择每个someName
元素作为其父节点的第一个someName
子元素。
因此,如果有两个或多个someName
元素是其父级的第一个someName
子元素,则会选中所有这些元素。
<强>解决方案强>:
而不是
//someName[1]
使用强>:
(//someName)[1]
因此,在您的特定情况下使用:
(//div[@class='abc']//a[contains(@href,'def')]) [1]
除此之外,如果在实际的XML文档中指定了默认命名空间,则上述表达式都不会选择任何节点。选择具有默认命名空间的文档中的节点是最大的XPath常见问题解答。要找到解决方案,只需在此SO标记中以及Internet上的任何位置搜索“默认命名空间”。
答案 1 :(得分:2)
您的XPath表达式选择每个 a
(具有正确的类)的第一个div
元素(右侧href)包含一个元素。因此,如果有两个匹配的div
个,每个匹配有多个a
个元素,则会得到一个包含两个元素的reault集 - 第一个a
1}},以及第二个div
中的第一个a
。
要仅选择整个结果集的第一个元素,请使用括号,如下所示:
div
除此之外,你的表达对我来说很好(测试here)。