XPATH选择所有前面的兄弟姐妹只选择第一个?我使用的软件的限制是什么?

时间:2017-09-26 15:04:26

标签: xpath

我有一个简单的表格,我试图解析数据,而且我在选择正确的元素时遇到了麻烦。该表的表示如下。带有class="subgroup-head"的2 TR是全宽列,而所有其他TR(class="odd" or "even")包含4列。

<TABLE class="transfers table">
    <TBODY>
        <TR class="subgroup-head">
            <TH>Transfers In</TH>
        <TR class="odd">
        <TR class="even">
        <TR class="odd">
        .
        .
        .
        .
        .
        <TR class="subgroup-head">
            <TH>Transfers Out</TH>
        <TR class="odd">
        <TR class="even">
        <TR class="odd">
        .
        .
        .
        .

我尝试选择跟随TR的所有表格行以及文本&#39; Transfers In&#39;通过&#39;转移到TR的TR直到文本。我想我可以使用preceding-siblingfollowing-sibling轻松完成此操作。但是,

//TABLE[@class='transfers table']/TBODY[1]/TR[preceding-sibling::TR[contains(text(),'Transfers Out')]]

只选择TR之后的第一个TR,其中class =&#39; subgroup-head&#39;和文字&#34;转出&#34;和

//TABLE[@class='transfers table']/TBODY[1]/TR[following-sibling::TR[contains(text(),'Transfers Out')]]

仅选择TR = class =&#39; subgroup-head&#39;和文本&#34;转移&#34;。我假设两者都会在TR之前或之后选择所有行,并且“转出”&#39;文本。这是我使用的软件的问题吗?

注意:我使用的软件不仅仅支持precedingfollowing,只支持-sibling。

我尝试了一种带有count方法的变体xpath,但它也提供了相同的结果 //TABLE[@class='transfers table']/TBODY[1]/TR[count(preceding-sibling::TR[contains(text(),'Transfers Out')])=1]

2 个答案:

答案 0 :(得分:0)

我找到了自己的答案,选择2个不同的元素组的2个x路径是

//TABLE[@class='transfers table']/TBODY[1]/TR[@class='odd' or @class='even'][following-sibling::TR[contains(text(),'Transfers out')]]

//TABLE[@class='transfers table']/TBODY[1]/TR[@class='odd' or @class='even'][preceding-sibling::TR[contains(text(),'Transfers out')]]

答案 1 :(得分:0)

问题在于函数调用contains(text(),'Transfers Out')text()返回包含subgroup-head节点的所有文本节点子节点的节点集。这将转换为在contains中使用的字符串,这意味着使用集合中 first 节点的值。在这种情况下,它是元素之前的空白节点,它不匹配。

如果您使用当前的上下文元素(即.),它将起作用。元素的字符串值是其所有后代文本节点的字符串值的串联,这是您想要的。

因此,您需要的两个查询是:

//TABLE[@class='transfers table']/TBODY[1]/TR[preceding-sibling::TR[contains(.,'Transfers Out')]]

//TABLE[@class='transfers table']/TBODY[1]/TR[following-sibling::TR[contains(.,'Transfers Out')]]

(第二个还包括您可能希望过滤掉的前导Transfers In行。