Xpath - 将组匹配作为组合结果

时间:2011-09-30 13:07:41

标签: xpath

我遇到以下问题,我想创建一个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>

2 个答案:

答案 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