计算包含两套以1分隔的1的列表中的1的数目

时间:2019-11-30 23:10:00

标签: xpath

我有两组1,以一定数量的0隔开。第一组1之前是任意数量的0,在第二组1之后是任意数量0。下面是一个示例实例。我需要一个XPath 2.0表达式,该表达式返回第一组中的1。而且,我需要一个XPath 2.0表达式,该表达式返回第二组1中的1数。对于下面的示例实例,第一个XPath表达式应返回2,第二个XPath表达式应返回3。

<Cells>
    <cell>
        <value>0</value>
    </cell>
    <cell>
        <value>1</value>
    </cell>
    <cell>
        <value>1</value>
    </cell>
    <cell>
        <value>0</value>
    </cell>
    <cell>
        <value>1</value>
    </cell>
    <cell>
        <value>1</value>
    </cell>
    <cell>
        <value>1</value>
    </cell>
    <cell>
        <value>0</value>
    </cell>
</Cells>

1 个答案:

答案 0 :(得分:1)

这看起来有些令人费解,但我认为它可以解决问题。此处的密钥为using the intersect() method

对于第一个表达式,请尝试:

 count(((//cell[value=1][following-sibling::cell[1][value=0] ][1]/(self::cell,preceding-sibling::cell[value=1])))

 intersect

(//cell[value=1][preceding-sibling::cell[1][value=0] ][1]/(self::cell,following-sibling::cell[value=1])))

并输出2

第二个表达式只寻找第二个组(请注意,[1]更改为[2]):

  count(((//cell[value=1][following-sibling::cell[1][value=0] ][2]/(self::cell,preceding-sibling::cell[value=1])))

     intersect

    (//cell[value=1][preceding-sibling::cell[1][value=0] ][2]/(self::cell,following-sibling::cell[value=1])))

并且胜过3

基本上,每个表达式都查找具有value的{​​{1}}的单元格组,这些单元格要么跟着1的{​​{1}}单元格,要么后面跟着一个这样的单元格,然后寻找这些单元格的交集-即,既跟着又跟着value值单元格的单元格。有两组此类单元格,0方法为每个此类组计数它们。最后,在适当的位置使用位置谓词0count()选择目标组。