[英]XPath: Select self and following sibling together
<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]
最后的[1]
很重要,因为没有它,它将提取包含“Test”的 dt 之后的所有dd 元素,即给定
<div>
<dt>
Test 1
</dt>
<dd>
Foo
</dd>
<dt>
Something else 2
</dt>
<dd>
Bar
</dd>
</div>
没有版本[1]
将匹配三个节点中, dt
含有“试验1”和两个“foo”和“棒” 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
为避免重复dt
元素的contains
测试,您可以重写查询,以便所有所需的输出元素仅在搜索条件中表示一次:
//*[contains(self::dt|self::dd/preceding-sibling::dt[1],"Test")]
说明:从所有可能的输出元素的池开始,然后选择dt
或dd
前面的dt
,其中dt
与搜索匹配。
包含此答案以显示一种减少代码重复并使其更易于阅读表达式的联合运算符的方法|
...
根据您的示例,您可能可以使用此 xpath,它更短更简单,但前提是您正在寻找 dt,然后您想要 dt 的所有兄弟姐妹(不仅仅是以下兄弟姐妹和自己)。 此 xpath 查找 dt 的父级并获取其所有子级:
//dt[contains(text(), "Test")]/../*
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.