首页 > 解决方案 > XSLT 中相同 xml 标记上的多个值

问题描述

我正在尝试使用 XSLT 转换 XML 数据,但是当转换为另一种 XML 格式时,多个值被映射到 XSLT 中的相同 xml 标记上。下面是输入。

<?xml version='1.0' encoding='UTF-8'?>
<MESSAGES>
    <COMMANDSTATUS ID="SHIPPED" DESCRIPTION="Goods Shipped">
        <ORDER O_ID="0003694706_1" TRACKING_URL="http://wwwapps.UPS.com/WebTracking/track?track=yes&amp;trackNums=1ZEW3567YW46706215">
            <ORDER_LINE OL_ID="1" SKU="28547859" QUANTITY="1"/>
            <ORDER_LINE OL_ID="3" SKU="28461473" QUANTITY="1"/>
        </ORDER>
    </COMMANDSTATUS>
    <COMMANDSTATUS ID="SHIPPED" DESCRIPTION="Goods Shipped">
        <ORDER O_ID="0003698153_1" TRACKING_URL="http://wwwapps.UPS.com/WebTracking/track?track=yes&amp;trackNums=1ZEW3571YW13958113">
            <ORDER_LINE OL_ID="1" SKU="28353647" QUANTITY="1"/>
            <ORDER_LINE OL_ID="2" SKU="28635431" QUANTITY="1"/>
            <ORDER_LINE OL_ID="3" SKU="28635399" QUANTITY="1"/>
            <ORDER_LINE OL_ID="6" SKU="28223766" QUANTITY="1"/>
        </ORDER>
    </COMMANDSTATUS>
</MESSAGES>

下面是 XSLT 代码。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
        <root>
            <xsl:for-each-group
                select="/MESSAGES/COMMANDSTATUS/ORDER"
                group-by="/MESSAGES/COMMANDSTATUS/ORDER/@O_ID">
                <orders>
                    <id>
                        <xsl:value-of select="current-grouping-key()" />
                    </id>
                    <xsl:for-each
                        select="current-group()[@O_ID = current-grouping-key()]">
                        <tracking_url>
                            <xsl:value-of select="@TRACKING_URL" />
                        </tracking_url>
                    </xsl:for-each>
                    <xsl:for-each
                        select="current-group()[@O_ID = current-grouping-key()]">
                        <lineItems>
                            <sku>
                                <xsl:value-of select="./ORDER_LINE/@SKU" />
                            </sku>
                            <quantity>
                                <xsl:value-of select="./ORDER_LINE/@QUANTITY" />
                            </quantity>
                        </lineItems>
                    </xsl:for-each>
                </orders>
            </xsl:for-each-group>
        </root>
    </xsl:template>
</xsl:stylesheet> 

以下是收到的输出。

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <orders>
      <id>0003694706_1</id>
      <tracking_url>http://wwwapps.UPS.com/WebTracking/track?track=yes&amp;trackNums=1ZEW3567YW46706215</tracking_url>
      <lineItems>
         <sku>28547859 28461473</sku>
         <quantity>1 1</quantity>
      </lineItems>
   </orders>
   <orders>
      <id>0003698153_1</id>
      <tracking_url>http://wwwapps.UPS.com/WebTracking/track?track=yes&amp;trackNums=1ZEW3571YW13958113</tracking_url>
      <lineItems>
         <sku>28353647 28635431 28635399 28223766</sku>
         <quantity>1 1 1 1</quantity>
      </lineItems>
   </orders>
</root>

下面是预期的输出。

<?xml version="1.0" encoding="UTF-8" ?>
<root>
    <orders>
        <id>0003694706_1</id>
        <tracking_url>http://wwwapps.UPS.com/WebTracking/track?track=yes&trackNums=1ZEW3567YW46706215</tracking_url>
        <lineItems>
            <sku>28547859</sku>
            <quantity>1</quantity>
        </lineItems>
        <lineItems>
            <sku>28461473</sku>
            <quantity>1</quantity>
        </lineItems>
    </orders>
    <orders>
        <id>0003698153_1</id>
        <tracking_url>http://wwwapps.UPS.com/WebTracking/track?track=yes&trackNums=1ZEW3571YW13958113</tracking_url>
        <lineItems>
            <sku>28353647</sku>
            <quantity>1</quantity>
        </lineItems>
        <lineItems>
            <sku>28635431</sku>
            <quantity>1</quantity>
        </lineItems>
        <lineItems>
            <sku>28635399</sku>
            <quantity>1</quantity>
        </lineItems>
        <lineItems>
            <sku>28223766</sku>
            <quantity>1</quantity>
        </lineItems>
    </orders>
<root>

谁能让我知道我在这里做错了什么。

标签: xslt

解决方案


您的示例数据似乎已经分组,所以我不确定您是否需要分组,但如果是这样,我认为您想按照以下方式进行分组

<xsl:template match="/">
    <root>
        <xsl:for-each-group
            select="/MESSAGES/COMMANDSTATUS/ORDER"
            group-by="@O_ID">
            <orders>
                <id>
                    <xsl:value-of select="current-grouping-key()" />
                </id>
                <xsl:for-each
                    select="current-group()">
                    <tracking_url>
                        <xsl:value-of select="@TRACKING_URL" />
                    </tracking_url>
                </xsl:for-each>
                <xsl:for-each
                    select="current-group()/ORDER_LINE">
                    <lineItems>
                        <sku>
                            <xsl:value-of select="@SKU" />
                        </sku>
                        <quantity>
                            <xsl:value-of select="@QUANTITY" />
                        </quantity>
                    </lineItems>
                </xsl:for-each>
            </orders>
        </xsl:for-each-group>
    </root>
</xsl:template>

推荐阅读