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

如何使用XSLT 2.0正确分组并关联Data_Group与Pay_Data_Group

解决多组Data_Group与Pay_Data_Group关联计算问题

核心方案:用XSLT键实现ID关联匹配

你之前尝试的键匹配没生效,大概率是键的定义或引用方式不对。下面是修正后的实现逻辑,结合你已有的分组逻辑,完成ID匹配、Amount提取和Converted_Hrs计算:

  1. 定义索引键:给Pay_Data_Group建立以ID为键的索引,方便后续快速查找
  2. 分组处理Data_Group:保留你原有的group-by="concat(ID, Tag)"分组逻辑
  3. 关联匹配与计算:在分组内通过键找到对应Pay_Data_Group的Amount,计算Converted_Hrs(示例中假设Converted_Hrs = Amount / 20,可根据实际需求修改计算规则)

完整XSLT代码示例

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 定义键:通过ID关联Pay_Data_Group -->
    <xsl:key name="pay-data-by-id" match="Pay_Data_Group" use="ID"/>

    <xsl:template match="/">
        <Output>
            <!-- 保留原有的分组逻辑 -->
            <xsl:for-each-group select="Data_Group" group-by="concat(ID, Tag)">
                <Group>
                    <GroupKey><xsl:value-of select="current-grouping-key()"/></GroupKey>
                    <!-- 获取当前分组对应的Pay_Data_Group -->
                    <xsl:variable name="matched-pay-group" select="key('pay-data-by-id', current-group()/ID)" />
                    
                    <!-- 检查是否存在匹配的Pay_Data_Group -->
                    <xsl:if test="$matched-pay-group">
                        <Amount><xsl:value-of select="$matched-pay-group/Amount"/></Amount>
                        <!-- 计算Converted_Hrs,这里示例为Amount除以20,按需修改 -->
                        <Converted_Hrs><xsl:value-of select="$matched-pay-group/Amount div 20"/></Converted_Hrs>
                    </xsl:if>
                    
                    <!-- 可添加分组内其他需要输出的Data_Group内容 -->
                    <xsl:for-each select="current-group()">
                        <Data>
                            <ID><xsl:value-of select="ID"/></ID>
                            <Tag><xsl:value-of select="Tag"/></Tag>
                        </Data>
                    </xsl:for-each>
                </Group>
            </xsl:for-each-group>
        </Output>
    </xsl:template>
</xsl:stylesheet>

示例XML输入

<Root>
    <Data_Group>
        <ID>1001</ID>
        <Tag>Hourly</Tag>
    </Data_Group>
    <Data_Group>
        <ID>1001</ID>
        <Tag>Hourly</Tag>
    </Data_Group>
    <Data_Group>
        <ID>1002</ID>
        <Tag>Salary</Tag>
    </Data_Group>
    <Pay_Data_Group>
        <ID>1001</ID>
        <Amount>400</Amount>
    </Pay_Data_Group>
    <Pay_Data_Group>
        <ID>1003</ID>
        <Amount>600</Amount>
    </Pay_Data_Group>
</Root>

示例输出

<Output>
    <Group>
        <GroupKey>1001Hourly</GroupKey>
        <Amount>400</Amount>
        <Converted_Hrs>20</Converted_Hrs>
        <Data>
            <ID>1001</ID>
            <Tag>Hourly</Tag>
        </Data>
        <Data>
            <ID>1001</ID>
            <Tag>Hourly</Tag>
        </Data>
    </Group>
    <Group>
        <GroupKey>1002Salary</GroupKey>
        <!-- 无匹配的Pay_Data_Group,不输出Amount和Converted_Hrs -->
        <Data>
            <ID>1002</ID>
            <Tag>Salary</Tag>
        </Data>
    </Group>
</Output>

关键说明

  • 键的定义必须放在模板之外,确保全局生效
  • 使用current-group()/ID获取分组内的ID,通过key()函数快速定位对应的Pay_Data_Group
  • 用<xsl:if test="$matched-pay-group">判断是否存在匹配数据,避免空值计算问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:45:32