真正的问题:我使用的是带有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
答案 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