XSLT группа на дочернем узле - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь конвертировать XML для группы дочерних узлов. Основная информация находится в узле bill , она должна быть сгруппирована по номерам счетов.

оригинальный XML, это упрощенная версия исходного XML

<items>
    <item>  
        <bill>10</bill>  
        <name>first (10)</name>
        <price>111</price>
    </item>
    <item>
        <bill>10</bill>
        <name>second (10)</name>
        <price>222</price>
    </item>
    <item>
        <bill>10</bill>
        <name>third (10)</name>
        <price>333</price>
    </item>
    <item>
        <bill>11</bill>
        <name>first (11)</name>
        <price>1</price>
    </item>
    <item>
        <bill>11</bill>
        <name>second (11)</name>
        <price>2</price>
    </item>
</items>

окончательный файл

<bills>
    <bill>
        <number>10</number>
        <items>
            <item>
                <nameitem>first (10)</nameitem>
                <priceitem>111</priceitem>
            </item>
            <item>
                <nameitem>second (10)</nameitem>
                <priceitem>222</priceitem>
            </item>
            <item>
                <nameitem>third (10)</nameitem>
                <priceitem>333</priceitem>
            </item>
        </items>
    </bill>
    <bill>
        <number>11</number>
        <items>
            <item>
                <nameitem>first (11)</nameitem>
                <priceitem>1</priceitem>
            </item>
            <item>
                <nameitem>second (11)</nameitem>
                <priceitem>2</priceitem>
            </item>
        </items>
    </bill>
</bills>

есть работающий XSLT для базовой группировки, но я не представляю, как построить другую структуру внутри узла bill на основе окончательного XML

<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:strip-space elements="*"/>
<xsl:key name="group-by-bill" match="item" use="bill"/>

<xsl:template match="items">
    <bills>
        <xsl:for-each select="item[generate-id()=generate-id (key('group-by-bill', bill)[1])]">
            <bill number="{bill}">
                <xsl:copy-of select="key('group-by-bill', bill)"/>
            </bill>
        </xsl:for-each>
    </bills>
</xsl:template>

1 Ответ

0 голосов
/ 29 апреля 2018

Используйте это:

<xsl:template match="items">
    <bills>
        <xsl:for-each select="item[generate-id()=generate-id (key('group-by-bill', bill)[1])]">
            <bill>
                <number><xsl:value-of select="bill"/></number>
                <items>
                    <xsl:for-each select="//item[bill = current()/bill]">
                        <item>
                            <xsl:copy-of select="name|price"/>
                        </item>
                    </xsl:for-each>
                </items>
            </bill>
        </xsl:for-each>
    </bills>
</xsl:template>

См. Преобразование в https://xsltfiddle.liberty -development.net / jyH9rM5

...