xpath 2.0 -如何计算计算值的总和?



CLM Doc Gen高级解释示例我的xml,如下。对于每个"部件"节点集,我将成本乘以数量(成本*数量)。这在节点集级别上工作得很好。我想把所有的(成本*数量)加起来,并把TOTAL放在我的文档的底部。

我只能使用xpath 2.0(不能使用xslt函数)。这可能吗?

提前感谢!

<AddPart_Container displayName="Add Sensor(s)" displayValue="Add Sensor(s)">
<Part displayName="Part (Sensor 02)" displayValue="Part (Sensor 02)">
<PartCategory>Hardware</PartCategory>
<PartName>Wireless Enterprise Vibration Sensor V3 (1 MP per)</PartName>
<PartNumber>PR55-61E</PartNumber>
<Cost>366.95</Cost>
<DirectPrice>492.95</DirectPrice>
<Qty>200</Qty>
</Part>
<Part displayName="Part (Sensor 04)" displayValue="Part (Sensor 04)">
<PartCategory>Hardware</PartCategory>
<PartName>Wireless 3 Channel Current Sensor - 0 to 100 (3 MP per)</PartName>
<PartNumber>PR55-26C</PartNumber>
<Cost>337.94</Cost>
<DirectPrice>492.95</DirectPrice>
<Qty>10</Qty>
</Part>
</AddPart_Container>

下面的对于每个节点都很好(我使用的程序有独特的语法)。现在我只需要为所有的节点集求和,我真的很挣扎,因为我正在求和这个计算字段。

<# <Content Select="round((./DirectPrice * ./Qty div 12) * 100) div 100"/> #>

我可能会使用for表达式来遍历所有Part元素并返回每个Part的计算结果,从而产生一系列数值。然后可以使用XPathsum函数按该顺序对数字求和。像这样:

sum(
for $part in 
//Part 
return
round(($part/DirectPrice * $part/Qty div 12) * 100) div 100
)

Result:8626.62

使用这个简单的XPath 2.0表达式——不需要for表达式:

sum( Part/(round(DirectPrice * Qty div 12 * 100) div 100))

基于XSLT 2.0的验证:

当这个变换:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:sequence select=
"sum( Part/(round(DirectPrice * Qty div 12 * 100) div 100))"/>
</xsl:template>
</xsl:stylesheet>

应用于所提供的XML文档:

<AddPart_Container displayName="Add Sensor(s)" displayValue="Add Sensor(s)">
<Part displayName="Part (Sensor 02)" displayValue="Part (Sensor 02)">
<PartCategory>Hardware</PartCategory>
<PartName>Wireless Enterprise Vibration Sensor V3 (1 MP per)</PartName>
<PartNumber>PR55-61E</PartNumber>
<Cost>366.95</Cost>
<DirectPrice>492.95</DirectPrice>
<Qty>200</Qty>
</Part>
<Part displayName="Part (Sensor 04)" displayValue="Part (Sensor 04)">
<PartCategory>Hardware</PartCategory>
<PartName>Wireless 3 Channel Current Sensor - 0 to 100 (3 MP per)</PartName>
<PartNumber>PR55-26C</PartNumber>
<Cost>337.94</Cost>
<DirectPrice>492.95</DirectPrice>
<Qty>10</Qty>
</Part>
</AddPart_Container>

对XPath表达式求值,并输出该求值的正确的预期结果:

8626.62

:

只有少数人知道并使用(路径表达式的)轴步可以是函数调用这一事实。这正是这个解决方案所使用的。

查看这些规则:

  1. https://www.w3.org/TR/xpath20/prod-xpath-StepExpr

  2. https://www.w3.org/TR/xpath20/prod-xpath-FilterExpr

  3. https://www.w3.org/TR/xpath20/doc-xpath-PrimaryExpr

  4. https://www.w3.org/TR/xpath20/doc-xpath-FunctionCall

最新更新