如何使用XSLT 2.0正确分组并关联Data_Group与Pay_Data_Group
解决多组Data_Group与Pay_Data_Group关联计算问题
核心方案:用XSLT键实现ID关联匹配
你之前尝试的键匹配没生效,大概率是键的定义或引用方式不对。下面是修正后的实现逻辑,结合你已有的分组逻辑,完成ID匹配、Amount提取和Converted_Hrs计算:
- 定义索引键:给Pay_Data_Group建立以ID为键的索引,方便后续快速查找
- 分组处理Data_Group:保留你原有的
group-by="concat(ID, Tag)"分组逻辑 - 关联匹配与计算:在分组内通过键找到对应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
相关产品推荐
相关产品推荐

