xml - 对分组的父元素 XSLT 中的子元素进行分组

标签 xml xslt foreach grouping

我正在使用for-each-group组合XML元素,我遇到的问题是这些XML元素有自己的子元素。 我还想结合子元素。

我的输入 XML 如下所示:

<Root>
   <Header>
   </Header>
   <Summary ID="1">
      <ID>1</ID>
      <Batch_Date>0228</Batch_Date>
      <Net_Sales_Amount>340.00</Net_Sales_Amount>
      <DATA_From_2>
         <Sales_Amount>340.00</_Sales_Amount>
      </DATA_From_2>
   </Summary>
   <Summary ID="1">
      <ID>1</ID>
      <Batch_Date>0228</Batch_Date>
      <Batch_Number>04002</Batch_Number>
      <Net_Sales_Amount>130.00</Net_Sales_Amount>
      <DATA_From_2>
         <Sales_Amount>130.00</Sales_Amount>
      </DATA_From_2>
      <DATA_From_8>
         <Invoice_Amount>20</Invoice_Amount>
         <Invoice_Number>123</Invoice_Number>
      </DATA_From_8>
      <DATA_From_8>
         <Invoice_Amount>15</Invoice_Amount>
         <Invoice_Number>456</Invoice_Number>
      </DATA_From_8>
   </Summary>
   <Summary ID="2">
      <ID>2</ID>
      <Batch_Date>0228</Batch_Date>
      <Net_Sales_Amount>40.00</Net_Sales_Amount>
      <DATA_From_2>
         <Sales_Amount>40.00</Sales_Amount>
      </DATA_From_2>
   </Summary>
   <Summary ID="2">
      <ID>2</ID>
      <Batch_Date>0228</Batch_Date>
      <Net_Sales_Amount>819.91</Net_Sales_Amount>
      <DATA_From_2>
         <Sales_Amount>734.91</Sales_Amount>
      </DATA_From_2>
      <DATA_From_5>
         <Sales_Amount>85.00</Sales_Amount>
      </DATA_From_5>
   </Summary>
</Root>

这是我的 XSLT 文件。我接近了我想要的输出,但它没有组合相同的子元素,而是将它们全部放在 Summary 元素中。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" />

    <xsl:template match="/*">
        <xsl:copy>
            <Root>
                <xsl:for-each-group select="/Root/Summary" group-by="@ID">
                    <Summary ID="{@ID}">
                        <!-- Copy values that are the same -->
                        <xsl:sequence select="ID, Batch_Date"/>

                        <!-- Sum the amounts -->
                        <Net_Sales_Amount>
                            <xsl:value-of select="format-number(sum(current-group()/Net_Sales_Amount), '0.00')"/>
                        </Net_Sales_Amount>

                        <!-- Combine the record types in this Summary element -->
<!--                        <xsl:sequence select="DATA_From_2, DATA_From_3, DATA_From_5, DATA_From_8"/> -->

                        <xsl:for-each-group select="current-group()" group-by="DATA_From_2">
                            <Data_From_2>
                                <Sales_Amount>
                                    <xsl:value-of select="format-number(sum(current-group()/Data_From_2/Combined_Sales_Amount), '0.00')"/>
                                </Sales_Amount>
                            </Data_From_2>
                        </xsl:for-each-group>

                        <xsl:for-each-group select="current-group()" group-by="DATA_From_8">
                            <Data_From_8>
                                <Invoice_Amount>
                                    <xsl:value-of select="format-number(sum(current-group()/Data_From_8/Invoice_Amount), '0.00')"/>
                                </Invoice_Amount>
                                <Invoice_Number>
                                    <xsl:value-of select="current-group()/Data_From_8/Invoice_Number" separator=" | "/>
                                </Invoice_Number>
                            </Data_From_8>
                        </xsl:for-each-group>
                    </Summary>
                </xsl:for-each-group>

                <Header>
                </Header>
                <Footer>
                </Footer>
            </Root>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

这是我当前的输出:

<Root>
   <Summary ID="1">
      <ID>1</ID>
      <Batch_Date>0228</Batch_Date>
      <Net_Sales_Amount>470.00</Net_Sales_Amount>
      <Data_From_2>
         <Sales_Amount>0.00</Sales_Amount>
      </Data_From_2>
      <Data_From_2>
         <Sales_Amount>0.00</Sales_Amount>
      </Data_From_2>
      <Data_From_8>
         <Invoice_Amount>0.00</Invoice_Amount>
         <Invoice_Number/>
      </Data_From_8>
      <Data_From_8>
         <Invoice_Amount>0.00</Invoice_Amount>
         <Invoice_Number/>
      </Data_From_8>
   </Summary>
   <Summary ID="2">
      <ID>2</ID>
      <Batch_Date>0228</Batch_Date>
      <Net_Sales_Amount>859.91</Net_Sales_Amount>
      <Data_From_2>
         <Sales_Amount>0.00</Sales_Amount>
      </Data_From_2>
      <Data_From_2>
         <Sales_Amount>0.00</Sales_Amount>
      </Data_From_2>
      <Data_From_2>
         <Sales_Amount>0.00</Sales_Amount>
      </Data_From_2>
   </Summary>
</Root>

XSLT 没有组合相同的 Data_From 元素,也没有正确填充值。

它应该是这样的:

<Root>
   <Summary ID="1">
      <ID>1</ID>
      <Batch_Date>0228</Batch_Date>
      <Net_Sales_Amount>470.00</Net_Sales_Amount>
      <Data_From_2>
         <Sales_Amount>470.00</Sales_Amount>
      </Data_From_2>
      <Data_From_8>
         <Invoice_Amount>35.00</Invoice_Amount>
         <Invoice_Number/>
      </Data_From_8>
   </Summary>
   <Summary ID="2">
      <ID>2</ID>
      <Batch_Date>0228</Batch_Date>
      <Net_Sales_Amount>859.91</Net_Sales_Amount>
      <Data_From_2>
         <Sales_Amount>771.91</Sales_Amount>
      </Data_From_2>
      <DATA_From_5>
         <Sales_Amount>85.00</Sales_Amount>
      </DATA_From_5>
   </Summary>
</Root>

XSLT 应组合相似的元素(Data_from_2、Data_from_5 等)并将值相加。 对于任何拼写错误或不正确的 XML,我深表歉意,我做了很多复制和粘贴。 谢谢

最佳答案

我认为以下是您想要的:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" />

    <xsl:template match="/*">
        <xsl:copy>
            <Root>
                <xsl:for-each-group select="/Root/Summary" group-by="@ID">
                    <Summary Merchant_ID="{@ID}">
                        <!-- Copy values that are the same -->
                        <xsl:sequence select="ID, Batch_Date"/>

                        <!-- Sum the amounts -->
                        <Net_Sales_Amount>
                            <xsl:value-of select="format-number(sum(current-group()/Net_Sales_Amount), '0.00')"/>
                        </Net_Sales_Amount>

                        <!-- Combine the record types in this Summary element -->
<!--                        <xsl:sequence select="DATA_From_2, DATA_From_3, DATA_From_5, DATA_From_8"/> -->

                        <xsl:for-each-group select="current-group()/*[starts-with(local-name(), 'DATA_')]" group-by="node-name(.)">
                           <xsl:apply-templates select="."/>
                         </xsl:for-each-group>

                    </Summary>
                </xsl:for-each-group>

                <Header>
                </Header>
                <Footer>
                </Footer>
            </Root>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="DATA_From_2 | DATA_From_5">
                            <xsl:copy>
                                <Sales_Amount>
                                    <xsl:value-of select="format-number(sum(current-group()/Sales_Amount), '0.00')"/>
                                </Sales_Amount>
                            </xsl:copy>
    </xsl:template>

    <xsl:template match="DATA_From_8">
                            <xsl:copy>
                                <Invoice_Amount>
                                    <xsl:value-of select="format-number(sum(current-group()/Invoice_Amount), '0.00')"/>
                                </Invoice_Amount>
                                <Invoice_Number>
                                    <xsl:value-of select="current-group()/Invoice_Number" separator=" | "/>
                                </Invoice_Number>
                            </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

关于xml - 对分组的父元素 XSLT 中的子元素进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22810988/

相关文章:

Sharepoint ItemStyle.xsl for CQWP 使用来自内容类型的图像

java - 在 lambda foreach 表达式 java 8 中获取索引

javascript - 如何将值推送到 Angular 中的嵌套对象?

java - admob interstitial 未显示在 google play 服务中?

c# - 如何使用 C# 从 XmlTextWriter 中删除 BOM?

xml - 在更现代的浏览器中运行非常旧的 XSLT 样式表时出现错误

ruby - 语法错误 : unexpected keyword_do_block

java - 在 Web 服务/客户端之间传递 JAXB 对象

java - hibernate 搜索 : Index an XML String?

xml - XSLT:XPATH 运算符 "less than or equal to"计算不正确