Условная группировка в XSLT - PullRequest
       28

Условная группировка в XSLT

0 голосов
/ 19 сентября 2018

Запрос вашей помощи для преобразования XML с использованием XSLT 2

Мой входной XML выглядит следующим образом.

    <?xml version="1.0" encoding="UTF-8"?>
<Workers>
    <Worker>
        <Batch_number>1234</Batch_number>
        <Name>David</Name>
        <Assignment>
            <type>A</type>
            <name>New York</name>
        </Assignment>
    </Worker>
    <Worker>
        <Batch_number>1234</Batch_number>
        <Name>David</Name>
        <Assignment>
            <type>B</type>
            <name>Boston</name>
        </Assignment>
    </Worker>
    <Worker>
        <Batch_number>1234</Batch_number>
        <Name>David</Name>
        <Assignment>
            <type>C</type>
            <name>Chicago</name>
        </Assignment>
    </Worker>
    <Worker>
        <Batch_number>78698</Batch_number>
        <Name>Karen</Name>
        <Assignment>
            <type>C</type>
            <name>Chicago</name>
        </Assignment>
    </Worker>
</Workers>

Желаемый вывод выглядит следующим образом.

<?xml version="1.0" encoding="UTF-8"?>
<Worker>
    <Batch_number>1234</Batch_number>
    <Name>David</Name>
    <Assignment>
            <type>A</type>
            <name>New York</name>
        </Assignment>
    <Assignment>
            <type>B</type>
            <name>Boston</name>
        </Assignment>
    <Assignment>
            <type>C</type>
            <name>Chicago</name>
        </Assignment>
</Worker>
<Worker>
    <Batch_number>78698</Batch_number>
    <Name>Karen</Name>
    <Assignment>
            <type>C</type>
            <name>Chicago</name>
        </Assignment>
</Worker>

Условие для преобразования:

Если дочерний узел <Worker> с таким же <Batch_number> существует во входном файлевсе Assignment узлы для одного и того же <Batch_number> должны быть сгруппированы под одним Worker дочерним узлом сразу после <Batch_number> и <Name>

Может кто-нибудь помочь мне написать правильный код, чтобы добиться этого, пожалуйста?

-Спасибо Anoop

1 Ответ

0 голосов
/ 19 сентября 2018

Хотя ваш желаемый выходной XML не является правильно сформированным , вот решение XSLT-2.0, которое удовлетворяет вашим особым потребностям:

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

    <xsl:template match="/Workers">
        <xsl:for-each-group select="Worker" group-by="Batch_number">
            <Worker>
                <Batch_number><xsl:value-of select="current-grouping-key()" /></Batch_number>
                <Name><xsl:value-of select="current()/Name" /></Name>
                <xsl:copy-of select="current-group()/Assignment" />
            </Worker>
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

Его вывод:

<?xml version="1.0" encoding="UTF-8"?>
<Worker>
    <Batch_number>1234</Batch_number>
    <Name>David</Name>
    <Assignment>
        <type>A</type>
        <name>New York</name>
    </Assignment>
    <Assignment>
        <type>B</type>
        <name>Boston</name>
    </Assignment>
    <Assignment>
        <type>C</type>
        <name>Chicago</name>
    </Assignment>
</Worker>
<Worker>
    <Batch_number>78698</Batch_number>
    <Name>Karen</Name>
    <Assignment>
        <type>C</type>
        <name>Chicago</name>
    </Assignment>
</Worker>
...