<div>
<dt>
Test 1
</dt>
<dd>
</dd>
<dt>
Test 2
</dt>
<dd>
</dd>
</div>
到目前为止,我已经编写了这个 XPath
//dt[contains(text(), "Test")]/self::dt|following-sibling::dd
但这并没有同时带来dt和dd,而只是带来dt。
如果它必须是单个 XPath 1.0 表达式,那么您将不得不说
//dt[contains(., 'Test')] | //dt[contains(., 'Test')]/following-sibling::dd[1]
final[1]
很重要,因为没有它,它将提取包含“Test”的 dt 之后的所有dd 元素,即给定
<div>
<dt>
Test 1
</dt>
<dd>
Foo
</dd>
<dt>
Something else 2
</dt>
<dd>
Bar
</dd>
</div>
没有 的版本[1]
将匹配三个节点,即dt
包含“Test 1”以及“ Foo”和“Bar”dd
元素。 有了它,[1]
您将正确地得到“Test 1”和“Foo”。
但是根据您使用 XPath 的确切方式,首先选择可能更清楚
//dt[contains(., 'Test')]
然后遍历匹配的节点,并评估
. | following-sibling::dd[1]
依次在每个节点的上下文中。
使用 XPath 2.0 时:
//dt[contains(text(), "Test")]/(self::dt, following-sibling::dd)
试试这个 XPATH:
//dt[contains(text(), "Test")]/self::dt or //dt[contains(text(), "Test")]/following-sibling::dd
为避免重复对元素的contains
测试dt
,您可以重写查询,以便所有所需的输出元素仅在搜索条件中表达一次:
//*[contains(self::dt|self::dd/preceding-sibling::dt[1],"Test")]
说明:从所有可能的输出元素的池开始,在这些元素中,选择 adt
或 add
前面的 a dt
,其中任一dt
匹配搜索。
包含此答案以显示一种减少代码重复并使其更易于阅读表达式的联合运算符的方法|
...
根据您的示例,您可能可以使用此 xpath,它更短更简单,但假设您正在寻找 dt,然后您想要 dt 的所有兄弟姐妹(不仅仅是以下兄弟姐妹和自我)。此 xpath 查找 dt 的父级并获取其所有子级:
//dt[contains(text(), "Test")]/../*