使用xsl 1.0将相似项目分组

时间:2018-12-24 11:02:37

标签: xslt-1.0

我需要根据OPERATION_CODE对记录进行分组。每条记录的组合标签中可以有多个“限额”。如果多个记录具有相同的operation_code,则我需要所有的余量。我正在使用xsl 1.0。  使用此xsl,我每条记录仅获得一个津贴(在示例输入中,第一条记录获得第一条津贴,第二条记录获得第一条津贴)。预期输出是第一条记录和第二条记录中的所有配额,因为operation_code相同。

  sample input: 
<root xmlns="">
<records>
    <record>
        <OPERATION_CODE>123456</OPERATION_CODE>
        <Combinations>
            <allowance>
                <WMI_CODE>MR0</WMI_CODE>
                <VDS_CODE>1</VDS_CODE>
            </allowance>    
            <allowance>
                <WMI_CODE>MR1</WMI_CODE>
                <VDS_CODE>2</VDS_CODE>
            </allowance>    
        </Combinations> 
        </record>
    <record>
        <OPERATION_CODE>123456</OPERATION_CODE>
        <Combinations>
            <allowance>
                <WMI_CODE>MR2</WMI_CODE>
                <VDS_CODE>3</VDS_CODE>
            </allowance>
        </Combinations> 
    </record>
    </records>
    </root>

预期输出:

<LaborOperationsDetail>
    <LaborOperationID>123456</LaborOperationID>
    <Combinations>
        <Allowance>
            <GroupID>MR0</star:GroupID>
            <VID>1</star:VID>
        </Allowance>
        <Allowance>
            <GroupID>MR1</star:GroupID>
            <VID>2</star:VID>
        </Allowance>
        <Allowance>
            <GroupID>MR2</star:GroupID>
            <VID>3</star:VID>
        </Allowance>
    </Combinations>
<LaborOperationsDetail>

使用的xsl:

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:key name="opcode" match="record" use="OPERATION_CODE" />
    <xsl:template match="root/records">
    <xsl:for-each select="record[generate-id() = generate-id(key('opcode', OPERATION_CODE)[1])]">
        <LaborOperationsDetail>
            <LaborOperationID><xsl:value-of select="OPERATION_CODE"/></LaborOperationID>
            <Combinations>           
            <xsl:for-each select="key('opcode' ,OPERATION_CODE)">
                 <Allowance>
                    <GroupID><xsl:value-of select="Combinations/allowance/WMI_CODE" /></GroupID>
                    <VID><xsl:value-of select="Combinations/allowance/VDS_CODE" /></VID>
                </Allowance>
            </xsl:for-each >
            </Combinations>  
        </LaborOperationsDetail>
    </xsl:for-each >
    </xsl:template>     
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

这样尝试吗?

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="opcode" match="record" use="OPERATION_CODE"/>

<xsl:template match="/root">
    <xsl:for-each select="records/record[generate-id() = generate-id(key('opcode', OPERATION_CODE)[1])]">
        <LaborOperationsDetail>
            <LaborOperationID>
                <xsl:value-of select="OPERATION_CODE"/>
            </LaborOperationID>
            <Combinations>           
                <xsl:for-each select="key('opcode' ,OPERATION_CODE)/Combinations/allowance">
                    <Allowance>
                        <GroupID>
                            <xsl:value-of select="WMI_CODE"/>
                        </GroupID>
                        <VID>
                            <xsl:value-of select="VDS_CODE"/>
                        </VID>
                    </Allowance>
                </xsl:for-each>
            </Combinations>  
        </LaborOperationsDetail>
    </xsl:for-each>
</xsl:template>     

</xsl:stylesheet>

您现在拥有的是:

<xsl:for-each select="key('opcode' ,OPERATION_CODE)">

选择当前组中的两个record节点,并为每个节点创建一个Allowance节点。在这些节点内,从每个allowance中的 first record中检索值。