在收到订单后,如果将订单行划分为两个框,则该公司将退回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>
答案 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>
输出
<?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>