Группировка похожих предметов с использованием xsl 1.0 - PullRequest
0 голосов
/ 24 декабря 2018

Мне нужно сгруппировать записи на основе OPERATION_CODE.Каждая запись может иметь несколько тегов Allowance в комбинации.Если более одной записи имеют один и тот же код операции, мне нужно все пособие вместе.Я использую xsl 1.0.Используя этот xsl, я получаю только одно пособие на запись (во входных данных для примера, первое пособие в первой записи и первое пособие во второй записи).Ожидаемый результат - это все допуски в первой и второй записи, поскольку код_операции один и тот же.

  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 голосов
/ 25 декабря 2018

Попробовать так?

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 узлу для каждого.В этих узлах значения извлекаются из first allowance в каждом record.

...