Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPATH选择所有前面的同级仅选择第一个同级?软件I'的限制;我在用什么?_Xpath - Fatal编程技术网

XPATH选择所有前面的同级仅选择第一个同级?软件I'的限制;我在用什么?

XPATH选择所有前面的同级仅选择第一个同级?软件I'的限制;我在用什么?,xpath,Xpath,我有一个简单的表,我正试图从中解析数据,但在选择合适的元素时遇到了困难。该表的表示如下。带有class=“subgroup head”的2个TR是全宽列,而所有其他TR(class=“odd”或“偶数”)包含4列 <TABLE class="transfers table"> <TBODY> <TR class="subgroup-head"> <TH>Transfers In</TH>

我有一个简单的表,我正试图从中解析数据,但在选择合适的元素时遇到了困难。该表的表示如下。带有
class=“subgroup head”
的2个TR是全宽列,而所有其他TR(
class=“odd”或“偶数”
)包含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后面的所有表格行,这些行的文本为“Transfers In”,直到TR的文本为“Transfers Out”。我想我可以使用
前面的兄弟姐妹
后面的兄弟姐妹
轻松完成这项工作。但是,

//TABLE[@class='transfers TABLE']/TBODY[1]/TR[前面的兄弟姐妹::TR[contains(text(),'transfers Out')]]

仅选择带有class='subgroup-head'和文本“Transfers Out”的TR之后的第一个TR,以及

//表[@class='transfers TABLE']/TBODY[1]/TR[以下同级::TR[contains(text(),'transfers Out')]]

仅选择带有class='subgroup-head'和文本“转入”的TR。我假设两者都会选择带有“Transfers Out”文本的TR之前或之后的所有行。这是我使用的软件的问题吗

注意:我使用的软件不支持前面的
或后面的
单独,仅支持-sibling

我尝试了一个带有count方法的变量xpath,但它也提供了相同的结果
//TABLE[@class='transfers TABLE']/TBODY[1]/TR[count(前面的兄弟姐妹::TR[contains(text(),'transfers Out'))=1]

我找到了自己的答案,我想要的两组独立元素的选择路径是

//TABLE[@class='transfers TABLE']/TBODY[1]/TR[@class='odd'或@class='偶数][following sibling::TR[contains(text(),'transfers out')]


//TABLE[@class='transfers TABLE']/TBODY[1]/TR[@class='odd'或@class='偶数'][前面的兄弟姐妹::TR[contains(text(),'transfers out')]
问题在于函数调用
contains(text(),'transfers out')
text()
返回包含
子组头的所有文本节点子节点的节点集。这将转换为字符串以用于
包含
,这意味着使用集合中第一个节点的值。在本例中,这是元素之前的仅空白节点,它不匹配

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

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

//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')]]