gpt4 book ai didi

xslt - 将 2 个数字相乘,然后求和

转载 作者:行者123 更新时间:2023-12-04 02:33:07 24 4
gpt4 key购买 nike

我在尝试做一些看起来应该很容易做的事情时遇到了困难。我基本上想将一个节点中的 2 个数字相乘,然后将所有节点的这些数字相加。这是我尝试过的 XSLT 代码。

<xsl:value-of select="sum(Parts/Part/Quantity * Parts/Part/Rate)"/>

此代码导致错误消息“函数 sum 的参数 1 无法转换为节点集”。

有没有人知道出了什么问题,或者我如何完成我想要做的事情?

最佳答案

以下是三种可能的解决方案 :

解决方案 1 XSLT2:

<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(/*/*/(rate * quantity))"/>
</xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时 :
<parts>
<part>
<rate>0.37</rate>
<quantity>10</quantity>
</part>
<part>
<rate>0.03</rate>
<quantity>10</quantity>
</part>
</parts>

产生了想要的结果 :

4

XSLT 2.0解决方案使用了在 XPath 2.0 中的事实允许最后一个“/”运算符的正确参数可以是表达式或通常是函数。该表达式/函数应用于迄今为止作为上下文节点选择的每个节点,并且每个函数应用产生一个结果。

解决方案 2 XSLT 1.0:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

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

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

<xsl:choose>
<xsl:when test="$pList">
<xsl:variable name="vHead" select="$pList[1]"/>

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

当应用于上述 XML 文档时,产生了正确的结果 :

4

这是一个典型的 XSLT 1.0 递归解决方案 . 请注意如何 sumProducts模板递归调用自身 ,直到整个输入列表,传入参数 $pList被处理。

解决方案 3 FXSL (XSLT 1.0):
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
xmlns:test-map-product="test-map-product"
exclude-result-prefixes="xsl ext test-map-product"
>
<xsl:import href="sum.xsl"/>
<xsl:import href="map.xsl"/>
<xsl:import href="product.xsl"/>

<!-- This transformation is to be applied on:
salesMap.xml

It contains the code of the "sum of products" from the
article "The Functional Programming Language XSLT"
-->

<test-map-product:test-map-product/>

<xsl:output method="text"/>

<xsl:template match="/">
<!-- Get: map product /sales/sale -->
<xsl:variable name="vSalesTotals">
<xsl:variable name="vTestMap" select="document('')/*/test-map-product:*[1]"/>
<xsl:call-template name="map">
<xsl:with-param name="pFun" select="$vTestMap"/>
<xsl:with-param name="pList1" select="/sales/sale"/>
</xsl:call-template>
</xsl:variable>

<!-- Get sum map product /sales/sale -->
<xsl:call-template name="sum">
<xsl:with-param name="pList" select="ext:node-set($vSalesTotals)/*"/>
</xsl:call-template>
</xsl:template>

<xsl:template name="makeproduct" match="*[namespace-uri() = 'test-map-product']">
<xsl:param name="arg1"/>

<xsl:call-template name="product">
<xsl:with-param name="pList" select="$arg1/*"/>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时 :
<sales>
<sale>
<price>3.5</price>
<quantity>2</quantity>
<Discount>0.75</Discount>
<Discount>0.80</Discount>
<Discount>0.90</Discount>
</sale>
<sale>
<price>3.5</price>
<quantity>2</quantity>
<Discount>0.75</Discount>
<Discount>0.80</Discount>
<Discount>0.90</Discount>
</sale>
</sales>

产生了正确的结果 :

7.5600000000000005

在最后一种情况下,每个 sale我们计算 price 的乘积, quantity和所有可用(可变数量) discount -s。

FXSL 是高阶函数的纯 XSLT 实现。在这个例子中,高阶函数 f:map()使用 映射函数 f:product()在每个 sale 的 child 名单上元素。然后将结果相加以产生最终结果。

关于xslt - 将 2 个数字相乘,然后求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/436998/

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