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

基于XPath 3.0/XSLT 3.0按国家分组Worker数据的问题求助

按国家分组输出Worker数据

输入XML

<root>
    <Response_Data>
        <Worker>
            <Worker_Data>
                <Worker_ID>100</Worker_ID>
                <User_ID>test</User_ID>
                <Personal_DAta>
                    <Name_Data>
                        <Legal_Name_Data>
                            <Name_Detail_Data>
                                <Country_Reference>
                                    <ID>AU</ID>
                                </Country_Reference>
                            </Name_Detail_Data>
                        </Legal_Name_Data>
                    </Name_Data>
                </Personal_DAta>
                <Employment_Data>
                    <Worker_Job_Data>
                        <Position_Data>
                            <Position_Reference>
                                <ID>P100</ID>
                            </Position_Reference>
                        </Position_Data>
                    </Worker_Job_Data>
                </Employment_Data>
            </Worker_Data>
        </Worker>
        <Worker>
            <Worker_Data>
                <Worker_ID>102</Worker_ID>
                <User_ID>test</User_ID>
                <Personal_DAta>
                    <Name_Data>
                        <Legal_Name_Data>
                            <Name_Detail_Data>
                                <Country_Reference>
                                    <ID>US</ID>
                                </Country_Reference>
                            </Name_Detail_Data>
                        </Legal_Name_Data>
                    </Name_Data>
                </Personal_DAta>
                <Employment_Data>
                    <Worker_Job_Data>
                        <Position_Data>
                            <Position_Reference>
                                <ID>P102</ID>
                            </Position_Reference>
                        </Position_Data>
                    </Worker_Job_Data>
                </Employment_Data>
            </Worker_Data>
        </Worker>
    </Response_Data>
</root>

需求

按国家对每个Worker的数据进行分组,输出格式如下:

国家 - 工人数量
Worker_ID, Position_Reference-ID

示例输出:

IN - 1
100, P100

AU - 2
101, P101
102, P102

尝试的XSLT代码

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:output method="html" version="5"/>
    <xsl:template match="/">
        <xsl:for-each-group select="/Get_Workers_Response/Response_Data" group-by="./Worker/Worker_Data/Personal_Data/Name_Data/Legal_Name_Data/Name_Detail_Data/Country_Reference/ID">
            <xsl:value-of select="./Worker/Worker_Data/Worker_ID"/>
            <xsl:value-of select="current-grouping-key()"/>
            <xsl:text>&#xa;</xsl:text>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

当前问题

运行上述代码后得到的输出不符合预期,所有Worker_ID被拼接后和国家代码一起输出:

100 102IN
100 102US

解决方案

问题核心是分组节点选择错误,应直接对单个Worker节点分组,同时调整输出格式包含工人数量和职位ID,修改后的XSLT如下:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <!-- 设置输出为文本格式,确保换行符生效 -->
    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
        <!-- 遍历每个Worker节点,按国家ID分组 -->
        <xsl:for-each-group select="/root/Response_Data/Worker" 
                            group-by="Worker_Data/Personal_DAta/Name_Data/Legal_Name_Data/Name_Detail_Data/Country_Reference/ID">
            <!-- 输出国家代码和工人数量 -->
            <xsl:value-of select="concat(current-grouping-key(), ' - ', count(current-group()))"/>
            <xsl:text>&#xa;</xsl:text>
            <!-- 遍历当前分组内的每个Worker,输出Worker_ID和职位ID -->
            <xsl:for-each select="current-group()">
                <xsl:value-of select="concat(Worker_Data/Worker_ID, ', ', Worker_Data/Employment_Data/Worker_Job_Data/Position_Data/Position_Reference/ID)"/>
                <xsl:text>&#xa;</xsl:text>
            </xsl:for-each>
            <!-- 分组之间添加空行分隔 -->
            <xsl:text>&#xa;</xsl:text>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

修改说明

  1. 分组节点调整:将分组对象从Response_Data改为单个Worker节点,确保每组对应同一国家的工人集合。
  2. 输出格式修正:用concat拼接国家代码与工人数量,遍历current-group()输出每个工人的Worker_ID和职位ID。
  3. 输出方法调整:将输出方法改为text,保证换行符能正确生效,输出纯文本格式。
  4. 路径匹配修正:修正XPath路径,确保与XML中Personal_DAta(大写D)的节点名完全匹配。

运行后输出

AU - 1
100, P100

US - 1
102, P102

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:37:26