对每组使用的变量求和



我有一个节点列表,我需要为其计算一个总数,然后将所述总数作为一个组求和。我已经创建了适当的变量,但当我使用sum((作为最终输出时,它会产生一个串联的字符串,而不是总值。

这是输入XML:

<LineItems>
<LineItem>
<OrderLine>
<OrderQty>1</OrderQty>
<UnitPrice>105.28</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
<LineItem>
<OrderLine>
<OrderQty>75</OrderQty>
<UnitPrice>2.88</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>3</OrderQty>
<UnitPrice>155.36</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>12</OrderQty>
<UnitPrice>1.64</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>2</OrderQty>
<UnitPrice>2.28</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>5</OrderQty>
<UnitPrice>3.6</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>1</OrderQty>
<UnitPrice>405.24</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>5</OrderQty>
<UnitPrice>79.04</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>1</OrderQty>
<UnitPrice>2.15</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>9</OrderQty>
<UnitPrice>2.15</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
</LineItems>

到目前为止,我一直在使用以下内容:

<tpi:Fact name="TotalLinePrice" factType="Virtual">
<xsl:for-each-group select="/PurchaseOrder/LineItems/LineItem/OrderLine" group-starting-with="OrderLine[normalize-space(OrderQty)]">
<xsl:variable name="uPrice" as="node()*">
<xsl:for-each select="current-group()">
<xsl:variable name="unitPrice">
<xsl:copy-of select="xs:decimal(current-group()/UnitPrice)"/>
</xsl:variable>
<xsl:variable name="orderQty">
<xsl:copy-of select="xs:decimal(current-group()/OrderQty)"/>
</xsl:variable>
<xsl:variable name="calcPriceBasis">
<xsl:choose>
<xsl:when test="current-group()[UnitPriceBasis='TP']">
<xsl:copy-of select="round(($unitPrice div 1000))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='HT']">
<xsl:copy-of select="round(($unitPrice div 1000))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='HP']">
<xsl:copy-of select="round(($unitPrice div 100))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='HTH']">
<xsl:copy-of select="round(($unitPrice div 100000))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='PD']">
<xsl:copy-of select="round(($unitPrice div 12))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='PN']">
<xsl:copy-of select="round(($unitPrice div 10))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='TT']">
<xsl:copy-of select="round(($unitPrice div 10000))"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$unitPrice"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<total>
<xsl:sequence select="format-number($calcPriceBasis * $orderQty, '0.00')"/>
</total>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="sum($uPrice)"/>
</xsl:for-each-group>
</tpi:Fact>

我得到的输出是:

"TOTALLINEPRICE":"105.28216466.0819.684.5618405.24395.22.1519.35"

哪个是这个计算的每个节点

<xsl:sequence select="format-number($calcPriceBasis * $orderQty, '0.00')"/>

作为连接字符串附加到自身。但我希望看到

"TOTALLINEPRICE": "1456.84"

其将是每个计算值的总和。

TOTALLINEPRICE是在XML内部创建的一个新节点,非常类似于添加

<TOTALLINEPRICE>
</TOTALLINEPRICE>

正如您所看到的,我需要根据每个节点本身的输入代码(UnitPriceBasis(来计算不同的价格基础。我知道xslt不是一种编程语言,变量在技术上是不可变的。但必须有办法做到这一点。

作为参考,我使用:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:tpi="http://www.spscommerce.net/tpi">

我哪里错了?

考虑以下简化示例:

XML

<items>
<item>
<qty>2</qty>
<price>10.00</price>
<group>A</group>
</item>
<item>
<qty>3</qty>
<price>5.00</price>
<group>A</group>
</item>
<item>
<qty>4</qty>
<price>8.00</price>
<group>A</group>
</item>
<item>
<qty>6</qty>
<price>3.00</price>
<group>B</group>
</item>
<item>
<qty>3</qty>
<price>9.00</price>
<group>B</group>
</item>
<item>
<qty>7</qty>
<price>8.00</price>
<group>C</group>
</item>
</items>

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/items">
<xsl:variable name="subtotals">
<xsl:for-each-group select="item" group-by="group">
<subtotal group="{current-grouping-key()}">
<xsl:value-of select="sum(current-group()/(price*qty))"/>
</subtotal>
</xsl:for-each-group>
</xsl:variable>
<output>
<xsl:copy-of select="$subtotals"/>
<total>
<xsl:value-of select="sum($subtotals/subtotal)"/>
</total>
</output>
</xsl:template>
</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
<subtotal group="A">67</subtotal>
<subtotal group="B">45</subtotal>
<subtotal group="C">56</subtotal>
<total>168</total>
</output>

看起来您想要的实际上是这个XSLT转换(从问题中提供的转换中获得,并修复了一些问题(:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<Fact name="TotalLinePrice" factType="Virtual">
<xsl:variable name="uPrice">
<xsl:for-each-group select="/PurchaseOrder/LineItems/LineItem/OrderLine" 
group-starting-with="OrderLine[normalize-space(OrderQty)]">
<xsl:for-each select="current-group()">
<xsl:variable name="unitPrice">
<xsl:copy-of select="xs:decimal(current-group()/UnitPrice)"/>
</xsl:variable>
<xsl:variable name="orderQty">
<xsl:copy-of select="xs:decimal(current-group()/OrderQty)"/>
</xsl:variable>
<xsl:variable name="calcPriceBasis">
<xsl:choose>
<xsl:when test="current-group()[UnitPriceBasis='TP']">
<xsl:copy-of select="round(($unitPrice div 1000))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='HT']">
<xsl:copy-of select="round(($unitPrice div 1000))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='HP']">
<xsl:copy-of select="round(($unitPrice div 100))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='HTH']">
<xsl:copy-of select="round(($unitPrice div 100000))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='PD']">
<xsl:copy-of select="round(($unitPrice div 12))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='PN']">
<xsl:copy-of select="round(($unitPrice div 10))"/>
</xsl:when>
<xsl:when test="current-group()[UnitPriceBasis='TT']">
<xsl:copy-of select="round(($unitPrice div 10000))"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$unitPrice"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<total>
<xsl:sequence select=
"xs:decimal(format-number($calcPriceBasis * $orderQty, '0.00'))"/>
</total>
</xsl:for-each>
</xsl:for-each-group>
</xsl:variable>
<xsl:copy-of select="sum($uPrice/*)"/>
</Fact>
</xsl:template>
</xsl:stylesheet>

当以上情况发生时,已更正的转换将应用于所提供的XML文档(已更正为格式良好的XML文档(:

<PurchaseOrder>
<LineItems>
<LineItem>
<OrderLine>
<OrderQty>1</OrderQty>
<UnitPrice>105.28</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>75</OrderQty>
<UnitPrice>2.88</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>3</OrderQty>
<UnitPrice>155.36</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>12</OrderQty>
<UnitPrice>1.64</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>2</OrderQty>
<UnitPrice>2.28</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>5</OrderQty>
<UnitPrice>3.6</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>1</OrderQty>
<UnitPrice>405.24</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>5</OrderQty>
<UnitPrice>79.04</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>1</OrderQty>
<UnitPrice>2.15</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
<LineItem>
<OrderLine>
<OrderQty>9</OrderQty>
<UnitPrice>2.15</UnitPrice>
<UnitPriceBasis>UM</UnitPriceBasis>
</OrderLine>
</LineItem>
</LineItems>
</PurchaseOrder>

生成看似需要的单个结果总和

<Fact name="TotalLinePrice" factType="Virtual">1651.5399999999997</Fact>

最新更新