是否可以在XSLT中对分段/节点进行分组和求和?

时间:2019-06-13 16:14:44

标签: xml xslt

在收到订单后,如果将订单行划分为两个框,则该公司将退回XML,其中一部分装在一个纸箱中,而另一些装在同一纸箱中。这给我们带来了问题,因为当我们将其发送回ERP时,它会发送例如4行,而订单上只有3行。

我看过这篇关于分组的文章,但是我迷路了!基本上,我要做的只是将其按文章分组,因此我可以对数量求和并将其保持在同一行。

我尝试使用本教程-https://www.codeproject.com/Articles/1849/Grouping-XML-using-XSLT-2

我只想复制该输出,但条261087750000出现一次,数量为66,而不是两次出现48和18。

我在for-each中尝试过此方法,但没有返回任何结果-

<xsl:for-each select="//dispatch[generate-id(.) = generate- 
id(key('keyArticle', Carton/CartonDetails/ArticleNumber)[1])]">
<xsl:variable name="lngArticle"><xsl:value-of 
select="Carton/CartonDetails/ArticleNumber" />
</xsl:variable>
<xsl:variable name="lstCarton" 
select="//Carton[Carton/CartonDetails/ArticleNumber=$lngArticle]" />

此处为实际XML-

<?xml version="1.0" encoding="UTF-8"?>
<Dispatches>
 <dispatch>
 <orderNo>4703368395</orderNo>
 <CartonQty>84</CartonQty>
 <Carton>
  <DispDate>20190613</DispDate>
  <CartonDetails>
   <LineNumber>1</LineNumber>                                  
   <ArticleNumber>261087750000</ArticleNumber>
   <Quantity>48</Quantity>
  </CartonDetails>
  <CartonDetails>
   <LineNumber>2</LineNumber>
   <ArticleNumber>261135720000</ArticleNumber>
   <Quantity>12</Quantity>
  </CartonDetails>
 </Carton>
 <Carton>
  <BoxNo>0920000075</BoxNo>
  <DispDate>20190613</DispDate>
  <CartonDetails>
   <LineNumber>1</LineNumber>
   <ArticleNumber>261087750000</ArticleNumber>
   <Quantity>18</Quantity>
   </CartonDetails>
   <CartonDetails>
   <LineNumber>2</LineNumber>
   <ArticleNumber>261087840000</ArticleNumber>
   <Quantity>6</Quantity>
   </CartonDetails>
  </Carton>
</dispatch>

预期结果将是-

<CartonDetails>
  <LineNumber>1</LineNumber>                                  
  <ArticleNumber>261087750000</ArticleNumber>
  <Quantity>66</Quantity>
</CartonDetails>

1 个答案:

答案 0 :(得分:1)

考虑跨多个模板工作,返回带有不同 ArticleNumber CartonDetails 。然后对键中的 Quantity 求和。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="keyArticle" match="CartonDetails" use="ArticleNumber"/>

  <xsl:template match="/Dispatches">
      <Carton>
          <xsl:apply-templates select="dispatch/Carton"/>
      </Carton>
  </xsl:template>

  <xsl:template match="Carton">
      <xsl:apply-templates select="CartonDetails[generate-id() =
                         generate-id(key('keyArticle', ArticleNumber)[1])]"/>
  </xsl:template>

  <xsl:template match="CartonDetails">
      <xsl:copy>
          <xsl:copy-of select="LineNumber|ArticleNumber"/>
          <Quantity>
             <xsl:value-of select="sum(key('keyArticle', ArticleNumber)/Quantity)"/>
          </Quantity>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Online Demo

输出

<?xml version="1.0" encoding="UTF-8"?>
<Carton>
   <CartonDetails>
      <LineNumber>1</LineNumber>
      <ArticleNumber>261087750000</ArticleNumber>
      <Quantity>66</Quantity>
   </CartonDetails>
   <CartonDetails>
      <LineNumber>2</LineNumber>
      <ArticleNumber>261135720000</ArticleNumber>
      <Quantity>12</Quantity>
   </CartonDetails>
   <CartonDetails>
      <LineNumber>2</LineNumber>
      <ArticleNumber>261087840000</ArticleNumber>
      <Quantity>6</Quantity>
   </CartonDetails>
</Carton>