XPATH:子节点不是整个XPATH的总和

时间:2017-09-01 16:23:56

标签: xml xpath

真正的问题:我使用的是带有2.0语法的XPATH 1.0,所以以下内容并不起作用:/root/row/checks[not(taxAmount = sum(selections/tax))]/sum(selections/tax/text())

我有以下XPATH:

/root/row/checks[./taxAmount/text() != sum(./selections/tax/text())]/selections/tax/text()

我想要以下内容:

/root/row/checks[./taxAmount/text() != sum(./selections/tax/text())]/sum(selections/tax/text())

我不想总结整个语句,只是在/选择下的子节点,但我到目前为止尝试的结果导致语法错误

基本上,我有检查标题信息,它不匹配详细信息,并希望总结细节以与标题进行比较。

示例XML:

<root>
  <row>
    <checks>
      <selections>       
        <tax>1.00</tax>
      </selections>
      <selections>       
        <tax>2.00</tax>
      </selections>
      <selections>       
        <tax>1.14</tax>
      </selections>
      <taxAmount>4.14</taxAmount>
    </checks>
    <checks>
      <selections>       
        <tax>1.00</tax>
      </selections>
      <selections>       
        <tax>0.50</tax>
      </selections>
      <selections>       
        <tax>1.00</tax>
      </selections>
      <taxAmount>3.00</taxAmount>
    </checks>
    <checks>
      <selections>       
        <tax>1.00</tax>
      </selections>
      <selections>       
        <tax>0.50</tax>
      </selections>
      <selections>       
        <tax>1.25</tax>
      </selections>
      <taxAmount>5.00</taxAmount>
    </checks>
  </row>
 </root>

根据Daniel的回答进行编辑:

那不是我想要的。这将选择有问题的检查,但我想要这样的事情:

/ root / row / checks [not(taxAmount = sum(selections / tax))] / taxAmount / text()

3.00

5.00

/ root / row / checks [not(taxAmount = sum(selections / tax))] / sum(selections / tax / text())

2.50

2.75

2 个答案:

答案 0 :(得分:2)

  

基本上,我有检查标题信息是不匹配的   细节信息,并希望总结细节与之比较   报头中。

如果您只是想确定selections/tax总和taxAmount不等于/root/row/checks[not(taxAmount = sum(selections/tax))] 的{​​{1}},您可以使用:

checks

根据您的示例输入,这将选择第二个taxAmount元素。

要输出selections/tax/root/row/checks[not(taxAmount = sum(selections/tax))]/concat(taxAmount,' ',sum(selections/tax)) 的总和,您可以使用以下(XPath 2.0):

3.00 2.5

这将使用您的示例输入输出pattern = re.compile(r'\/(\w+\.(?:txt|sh))')

答案 1 :(得分:0)

我使用Python lxml,我必须检查delta是否大于epsilon才能获得适当的元素:

/root/row/checks[sum(./selections/tax/text()) - ./taxAmount/text() > 1e-6 or sum(./selections/tax/text()) - ./taxAmount/text() < -1e-6]

可悲的是,XPath 1.0(libxml2不支持更新版本)没有abs()功能,所以我们必须使用or

平等检查对我不起作用:

>>> tree.xpath('sum((//checks)[1]/selections/tax/text())')
4.140000000000001

>>> tree.xpath('sum((//checks)[1]/selections/tax/text()) - (//checks)[1]/taxAmount/text()')
8.881784197001252e-16