假设您有一个如下所示的 XML:
<scores>
<score cnt="2">10</score>
<score cnt="0">20</score>
<score cnt="1">50</score>
</scores>
我想得到的是总和,应该是 70 = (2*10 + 1*50)。因此,节点值及其属性与所有节点的最终总和相乘。
果然我知道如何对值求和:sum(//score)
或属性 sum(//score/@cnt)
但我无法弄清楚如何将这两个放在一起。这是怎么做到的?
最佳答案
使用单个 XPath 1.0 表达式无法进行此类计算。如果可以使用 XPath 2.0,就可以做到:
sum(for $x in /scores/score return $x * $x/@cnt)
编辑 一个更短的等效路径表达式,尽管更隐晦,是
sum(/scores/score/(. * @cnt))
感谢 Ian Roberts 的建议。
prove it 的 XSLT 样式表:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<result>
<xsl:value-of select="sum(for $x in /scores/score return $x * $x/@cnt)"/>
</result>
</xsl:template>
</xsl:transform>
结果是
<result>70</result>
关于xml - 使用 XPATH 乘以节点值和属性的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29604237/