<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。
//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]
的版本将匹配三个节点,即包含“Test 1”的dt
和“Foo”以及“Bar”dd
元素。有了[1]
,你将只得到“Test 1”和“Foo”。但根据你使用XPath的方式,先选择某些元素可能更清晰。
//dt[contains(., 'Test')]
然后迭代匹配的节点,并进行评估。
. | following-sibling::dd[1]
在依次处理每个节点的上下文中。
//dt[contains(text(), "Test")]/(self::dt, following-sibling::dd)
dt
元素的 contains
,您可以重写查询,使所有所需的输出元素仅在搜索条件中表达一次://*[contains(self::dt|self::dd/preceding-sibling::dt[1],"Test")]
解释:从所有可能的输出元素池开始,选择一个以dt
为前导或者以dt
为前导的dd
,其中dt
匹配搜索条件。
包含此答案是为了展示一种减少代码重复并使表达式的联合运算符|
更易于阅读的方法...
尝试使用这个XPATH:
//dt[contains(text(), "Test")]/self::dt or //dt[contains(text(), "Test")]/following-sibling::dd
//dt[contains(text(), "Test")]/../*