<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 。
答案 0 :(得分:4)
如果它必须是单个XPath 1.0表达式,那么你将不得不说
//dt[contains(., 'Test')] | //dt[contains(., 'Test')]/following-sibling::dd[1]
最终的[1]
很重要,因为没有它会提取所有 dd元素,这些元素跟随包含“Test”的dt,即给定
<div>
<dt>
Test 1
</dt>
<dd>
Foo
</dd>
<dt>
Something else 2
</dt>
<dd>
Bar
</dd>
</div>
没有[1]
的版本将匹配三个节点,dt
包含“测试1”和两者“Foo”和“Bar”dd
元素。 使用 [1]
,您只能正确获得“测试1”和“Foo”。
但是,根据您使用XPath的具体方式,首先选择
可能会更清楚//dt[contains(., 'Test')]
然后迭代匹配的节点,并评估
. | following-sibling::dd[1]
依次在每个节点的上下文中。
答案 1 :(得分:2)
使用XPath 2.0时:
//dt[contains(text(), "Test")]/(self::dt, following-sibling::dd)
答案 2 :(得分:0)
试试这个XPATH:
//dt[contains(text(), "Test")]/self::dt or //dt[contains(text(), "Test")]/following-sibling::dd
答案 3 :(得分:0)
为避免重复contains
元素的dt
测试,您可以重写查询,以便所有需要的输出元素仅在搜索条件中表示一次:
//*[contains(self::dt|self::dd/preceding-sibling::dt[1],"Test")]
说明:从所有可能输出元素的池开始,选择dt
或dd
前面的dt
,其中dt
与搜索匹配。
这个答案包括一个减少代码重复的方法,并且更容易阅读表达式的联合运算符|
......
答案 4 :(得分:0)
我尝试做类似的事情。
(在XPath group selected node with next sibling中,我尝试将它们分组。)
也许有人对我的小组问题有答案。
带有该线程的XML
<div>
<dt>
Test 1
</dt>
<dd>
Foo
</dd>
<dt>
Something else 2
</dt>
<dd>
Bar
</dd>
</div>
(作为数组结果集)
1. <dt>Test 1</dt><dd>Foo</dd>
2. <dt>Something else 2</dt><dd>Bar</dd>
答案 5 :(得分:-1)
根据你的例子,你可能能够使用这个xpath,它更短更简单,但是假设你正在寻找dt,然后你想要dt的所有兄弟姐妹(不仅仅是以下的兄弟姐妹和自)。此xpath查找dt的父级并抓取其所有子级:
//dt[contains(text(), "Test")]/../*