我遇到以下问题,我想创建一个Xpath表达式,结果为3个匹配,其中match1 = text1text1text,match2 = text2text2text2等。
我能够找到每个单独的,但我不能“分组”它们。
表达式应该说的是:“在[@ class =”random-a-tag“]之后,给我所有在div [@id]”
<a class="random-a-tag"></a>
<p>text1</p>
<p>text1</p>
<p>text1</p>
<div id="1"></div>
<p>text2</p>
<p>text2</p>
<p>text2</p>
<div id="2"></div>
<p>text3</p>
<p>text3</p>
<p>text3</p>
<div id="3"></div>
答案 0 :(得分:2)
您可以分两步完成此操作。
找到所有div
//a[@class="random-a-tag"]/following-sibling::div[@id]
和每个div @id do:
//a[@class="random-a-tag"]/following-sibling::p[following-sibling::div[1][@id="3"]]/text()
答案 1 :(得分:1)
使用单个XPath 1.0表达式无法完成此操作。
对于给定值p
,您可以选择的最多是@id
的集合:
/*/a/following-sibling::div
[@id=$pId]
/preceding-sibling::p
[count(.
|
/*/a/following-sibling::div
[@id=$pId]
/preceding-sibling::div[1]
/preceding-sibling::p
)
=
count(/*/a/following-sibling::div
[@id=$pId]
/preceding-sibling::div[1]
/preceding-sibling::p
)
+1
]
如果$pId
被(替换为)2,并且上述XPath表达式应用于此XML文档(您的XML片段,包含在顶部元素中以使其格式正确XML文档):
<t>
<a class="random-a-tag"></a>
<p>text1</p>
<p>text1</p>
<p>text1</p>
<div id="1"></div>
<p>text2</p>
<p>text2</p>
<p>text2</p>
<div id="2"></div>
<p>text3</p>
<p>text3</p>
<p>text3</p>
<div id="3"></div>
</t>
然后选择以下节点:
<p>text2</p>
<p>text2</p>
<p>text2</p>
在上面的XPath表达式中,我们使用着名的Kayessian(由@Michael Kay创建)用于节点集交集的公式:
$ns1[count(.|$ns2) = count($ns2)]
是节点集$ns1
和$ns2
的交集。
<强> II。 XPath 2.0解决方案:
(a/following-sibling::div
[@id=$pId]
/preceding-sibling::p
except
a/following-sibling::div
[@id=$pId]
/preceding-sibling::div[1]
/preceding-sibling::p
)/string()
当针对同一XML文档(上图)评估此XPath 2.0表达式并且$pId
为2时,结果恰好是想要的文本:
text2 text2 text2