基于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>
</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>
</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>
</xsl:text> </xsl:for-each> <!-- 分组之间添加空行分隔 --> <xsl:text>
</xsl:text> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>
修改说明
- 分组节点调整:将分组对象从
Response_Data改为单个Worker节点,确保每组对应同一国家的工人集合。 - 输出格式修正:用
concat拼接国家代码与工人数量,遍历current-group()输出每个工人的Worker_ID和职位ID。 - 输出方法调整:将输出方法改为
text,保证换行符能正确生效,输出纯文本格式。 - 路径匹配修正:修正XPath路径,确保与XML中
Personal_DAta(大写D)的节点名完全匹配。
运行后输出
AU - 1 100, P100 US - 1 102, P102
内容的提问来源于stack exchange,提问作者Ravi Gupta
相关产品推荐
相关产品推荐

