gpt4 book ai didi

xslt-1.0 - XPath 中求和与求积的聚合函数

转载 作者:行者123 更新时间:2023-12-01 11:01:03 24 4
gpt4 key购买 nike

类似于这个问题 (http://stackoverflow.com/q/1333558/948404) 我想使用 XPath 来计算这样一个结构中产品的总和:

<items>
<item>
<value>1.0</value>
<quantity>3</quantity>
</item>
<item>
<value>2.5</value>
<quantity>2</quantity>
</item>
<!-- ... -->
</items>

是否有一个 XPath 表达式计算每个项目 valuequantity 的乘积之和?

更新:该解决方案必须与 PHP 的 XSLTProcessor 类一起使用,这意味着它可能必须与 XSLT 1.0 兼容。这就是为什么我还没有接受使用 XSLT 2.0 的两个可能正确的答案。我既不能在我的 PHP 实现中测试它们,也不能在我的浏览器中测试它们,也不能在 w3schools 的 Tryit 编辑器 [1] 中测试它们。对不起!

  1. http://w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

最佳答案

使用这个 XPath 2.0 表达式:

sum(/items/item/(value * quantity))

这是一个 XSLT 2.0 转换作为验证:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/">
<xsl:sequence select="sum(/items/item/(value * quantity))"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<items>
<item>
<value>1.0</value>
<quantity>3</quantity>
</item>
<item>
<value>2.5</value>
<quantity>2</quantity>
</item>
<!-- ... -->
</items>

对 XPath 表达式求值并输出求值结果:

8

解释:

在 XPath 2.0 中,定位步骤是合法的

/(表达式),

甚至

/someFunction(argumentList)


二。 XSLT 1.0 解决方案:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/*">
<xsl:call-template name="sumProducts">
<xsl:with-param name="pNodes" select="item"/>
</xsl:call-template>
</xsl:template>

<xsl:template name="sumProducts">
<xsl:param name="pNodes" select="/.."/>
<xsl:param name="pAccum" select="0"/>

<xsl:choose>
<xsl:when test="not($pNodes)">
<xsl:value-of select="$pAccum"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="sumProducts">
<xsl:with-param name="pNodes" select="$pNodes[position() >1]"/>
<xsl:with-param name="pAccum" select=
"$pAccum + $pNodes[1]/value * $pNodes[1]/quantity"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

当此转换应用到所提供的 XML 文档(上图)时,再次生成所需的正确结果:

8

请注意:使用 FXSL library 很容易解决这类问题。 。要调用的模板是 transform-and-sum

关于xslt-1.0 - XPath 中求和与求积的聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10669313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com