Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 使用子节点值进行分组,并将分组的值求和一次_Xslt_Xslt 2.0 - Fatal编程技术网

Xslt 使用子节点值进行分组,并将分组的值求和一次

Xslt 使用子节点值进行分组,并将分组的值求和一次,xslt,xslt-2.0,Xslt,Xslt 2.0,我有一个类似下面的场景,我想用子元素值对元素进行分组,并将数量相加。使用XSLT1.0 Input: <body> <Root1> <Root2> <E1>abc</merchantcode> <C1> <order> <catalog>

我有一个类似下面的场景,我想用子元素值对元素进行分组,并将数量相加。使用XSLT1.0

Input:
<body>
    <Root1>
        <Root2>
            <E1>abc</merchantcode>
            <C1>
                <order>
                    <catalog>
                        <catalogitem>100</catalogitem>
                        <sku>100</sku>
                        <quantity>1</quantity>
                    </catalog>
                </order>
            </C1>
            <C1>
                <order>
                    <catalog>
                        <catalogitem>100</catalogitem>
                        <sku>100</sku>
                        <quantity>2</quantity>
                    </catalog>
                </order>
            </C1>
            <C1>
                <order>
                    <catalog>
                        <catalogitem>111</catalogitem>
                        <sku>111</sku>
                        <quantity>1</quantity>
                    </catalog>
                </order>
            </C1>
        </Root2>
    </Root1>
</body>
输入:
abc
100
100
1.
100
100
2.
111
111
1.
我想根据sku值对上述XML文档进行分组。然后我想把数量加起来。 以下是我想要的结果:

<body>
    <Root1>
        <Root2>
            <E1>abc</merchantcode>
            <C1>
                <order>
                    <catalog>
                        <catalogitem>100</catalogitem>
                        <sku>100</sku>
                        <quantity>3</quantity>
                    </catalog>
                </order>
            </C1>
            <C1>
                <order>
                    <catalog>
                        <catalogitem>111</catalogitem>
                        <sku>111</sku>
                        <quantity>1</quantity>
                    </catalog>
                </order>
            </C1>
        </Root2>
    </Root1>
</body>

abc
100
100
3.
111
111
1.
有人能帮我吗?

这样试试:

XSLT2.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"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Root2">
    <xsl:copy> 
        <xsl:apply-templates select="* except C1"/>
        <xsl:for-each-group select="C1" group-by="order/catalog/sku"> 
            <C1>
                <order>
                    <catalog>
                        <xsl:copy-of select="order/catalog/(catalogitem | sku)" /> 
                        <quantity>
                            <xsl:value-of select="sum(current-group()/order/catalog/quantity)" /> 
                        </quantity>
                    </catalog>
                </order>
            </C1>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

XSLT1.0解决方案:

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

 <xsl:key name="kCatalogsByItemaAndSKU" match="C1"
   use="concat(order/catalog/catalogitem, '+', order/catalog//sku)"/>

  <xsl:template match="node()|@*" name="identity">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="C1"/>

  <xsl:template match="C1[generate-id()
                         = generate-id(key('kCatalogsByItemaAndSKU',
                                            concat(order/catalog/catalogitem,
                                                  '+', order/catalog/sku)
                                            )[1]
                                       )
                          ]">
    <C1><xsl:apply-templates/></C1>
  </xsl:template>

  <xsl:template match="C1/order/catalog/quantity/text()">
     <xsl:value-of select=
     "sum(key('kCatalogsByItemaAndSKU',
               concat(../../catalogitem, '+', ../../sku)
               )/order/catalog/quantity)"/>
  </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时(固定为格式正确):


abc
100
100
1.
100
100
2.
111
111
1.
生成所需的正确结果

<body>
   <Root1>
      <Root2>
         <E1>abc</E1>
         <C1>
            <order>
               <catalog>
                  <catalogitem>100</catalogitem>
                  <sku>100</sku>
                  <quantity>3</quantity>
               </catalog>
            </order>
         </C1>
         <C1>
            <order>
               <catalog>
                  <catalogitem>111</catalogitem>
                  <sku>111</sku>
                  <quantity>1</quantity>
               </catalog>
            </order>
         </C1>
      </Root2>
   </Root1>
</body>

abc
100
100
3.
111
111
1.

您到底在哪里遇到了这个问题?我已经尝试过这样做,但没有成功,标签上写着“使用xslt 1.0”。注释中的代码对每个组使用xsl:。那么您使用或可以使用哪个版本?
<body>
   <Root1>
      <Root2>
         <E1>abc</E1>
         <C1>
            <order>
               <catalog>
                  <catalogitem>100</catalogitem>
                  <sku>100</sku>
                  <quantity>3</quantity>
               </catalog>
            </order>
         </C1>
         <C1>
            <order>
               <catalog>
                  <catalogitem>111</catalogitem>
                  <sku>111</sku>
                  <quantity>1</quantity>
               </catalog>
            </order>
         </C1>
      </Root2>
   </Root1>
</body>