You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XSLT 2.0分组问题:无索引logisticsFlatRate段处理与结构转换

问题描述

需将输入XML转换为指定的扁平结构,现有XSLT 2.0代码无法正确关联无index字段的logisticsFlatRate到对应分组,同时Currency字段的提取逻辑缺失。

期望输出XML

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Responses>
        <index>000010</index>
        <brutto>246.09</brutto>
        <bruttoSingle>246.09</bruttoSingle>
        <netto>7327.14</netto>
        <nettoSingle>244.24</nettoSingle>
        <logisticsFlatRateValue>18.27</logisticsFlatRateValue>
        <logisticsFlatRatePercentage>0.25</logisticsFlatRatePercentage>
        <Currency>USD</Currency>
    </Responses>
    <Responses/>
    <Responses>
        <index>000020</index>
        <brutto>10.20</brutto>
        <bruttoSingle>10.20</bruttoSingle>
        <netto>2.88</netto>
        <nettoSingle>2.88</nettoSingle>
        <logisticsFlatRateValue>15.27</logisticsFlatRateValue>
        <logisticsFlatRatePercentage>0.45</logisticsFlatRatePercentage>
        <Currency>USD</Currency>
    </Responses>
    <Responses/>
</Response>

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Responses>
        <brutto>
            <indx>000010</indx>
            <value>246.09</value>
            <currency>USD</currency>
        </brutto>
        <bruttoSingle>
            <indx>000010</indx>
            <value>246.09</value>
            <currency>USD</currency>
        </bruttoSingle>
        <logisticsFlatRate>
            <value>18.27</value>
            <percentage>0.25</percentage>
        </logisticsFlatRate>
    </Responses>
    <Responses>
        <netto>
            <indx>000010</indx>
            <value>7327.14</value>
            <currency>USD</currency>
        </netto>
        <nettoSingle>
            <indx>000010</indx>
            <value>244.24</value>
            <currency>USD</currency>
        </nettoSingle>
    </Responses>
    <Responses/>
    <Responses>
        <brutto>
            <indx>000020</indx>
            <value>10.20</value>
            <currency>USD</currency>
        </brutto>
        <bruttoSingle>
            <indx>000020</indx>
            <value>10.20</value>
            <currency>USD</currency>
        </bruttoSingle>
    </Responses>
    <Responses>
        <netto>
            <indx>000020</indx>
            <value>2.88</value>
            <currency>USD</currency>
        </netto>
        <nettoSingle>
            <indx>000020</indx>
            <value>2.88</value>
            <currency>USD</currency>
        </nettoSingle>
        <logisticsFlatRate>
            <value>15.27</value>
            <percentage>0.45</percentage>
        </logisticsFlatRate>
    </Responses>
    <Responses/>
</Response>

现有XSLT代码及问题

现有代码无法将logisticsFlatRate关联到对应index的分组,且未处理Currency字段提取:

<?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="/">
        <xsl:for-each-group select="//Responses/*[index]" group-by="index">
            <group>
                <index><xsl:value-of select="current-grouping-key()"/></index>
                <items>
                    <xsl:for-each select="current-group()">
                        <xsl:element name="{name()}">
                            <xsl:value-of select="value"/>
                        </xsl:element>
                    </xsl:for-each>
                    <xsl:for-each select="/Response/Responses/logisticsFlatRate">
                        <xsl:copy-of select="."/>
                    </xsl:for-each>
                </items>
            </group>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

解决方案XSLT 2.0

<?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="/Response">
        <Response>
            <!-- 按唯一indx值分组 -->
            <xsl:for-each-group select=".//*[indx]" group-by="indx">
                <xsl:variable name="currentIndx" select="current-grouping-key()"/>
                <Responses>
                    <index><xsl:value-of select="$currentIndx"/></index>
                    <!-- 输出各字段的value值 -->
                    <xsl:for-each select="current-group()">
                        <xsl:element name="{name()}">
                            <xsl:value-of select="value"/>
                        </xsl:element>
                    </xsl:for-each>
                    <!-- 关联对应indx的logisticsFlatRate并转换为扁平结构 -->
                    <xsl:for-each select=".//Responses[*[indx = $currentIndx]]/logisticsFlatRate">
                        <logisticsFlatRateValue><xsl:value-of select="value"/></logisticsFlatRateValue>
                        <logisticsFlatRatePercentage><xsl:value-of select="percentage"/></logisticsFlatRatePercentage>
                    </xsl:for-each>
                    <!-- 提取Currency字段 -->
                    <Currency><xsl:value-of select="current-group()[1]/currency"/></Currency>
                </Responses>
                <!-- 输出空Responses节点 -->
                <Responses/>
            </xsl:for-each-group>
        </Response>
    </xsl:template>
</xsl:stylesheet>

核心逻辑说明

  1. 分组方式:通过.//*[indx]选择所有含indx的节点,按indx值分组,确保同一index的所有字段聚合。
  2. logisticsFlatRate关联:通过.//Responses[*[indx = $currentIndx]]定位包含当前indx的Responses节点,从中提取logisticsFlatRate的子节点并转换为扁平字段。
  3. Currency提取:取当前分组第一个节点的currency值(假设同一index下货币一致)。
  4. 结构对齐:每个分组对应一个Responses节点,后跟空Responses节点,匹配期望输出格式。

内容的提问来源于stack exchange,提问作者jimboextended

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:05:00