группировать по XML-документу по дочернему элементу

У меня есть следующий xml. Это набор родительских узлов записи, содержащих идентификаторы, количество и категорию.

<Data>
<record>
    <identifier>1000</identifier>
    <category>B</category>
    <quantity>90.00</quantity>
</record>
<record>
    <identifier>1000</identifier>
    <category>B</category>
    <quantity>50.00</quantity>
</record>
<record>
    <identifier>1001</identifier>
    <category>B</category>
    <quantity>13.00</quantity>
</record>
<record>
    <identifier>1002</identifier>
    <category>B</category>
    <quantity>100.00</quantity>
</record>

I need to group by the record element by the child "identifier". The excpected output is this.

<Data>
<records>
    <record>
        <identifier>1000</identifier>
        <category>B</category>
        <quantity>90.00</quantity>
    </record>
    <record>
        <identifier>1000</identifier>
        <category>B</category>
        <quantity>50.00</quantity>
    </record>
</records>
<records>
    <record>
        <identifier>1001</identifier>
        <category>B</category>
        <quantity>13.00</quantity>
    </record>
</records>
<records>
    <record>
        <identifier>1002</identifier>
        <category>B</category>
        <quantity>100.00</quantity>
    </record>
</records>

I'm using this xslt but it's not working neither at grouping level.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:template match="Data">
    <Data>
        <xsl:for-each-group select="record" group-by="identifier">
            <records>
                <xsl:for-each select="current-group()">
                    <xsl:copy>
                        <xsl:value-of select="*" />
                    </xsl:copy>
                </xsl:for-each>
            </records>
        </xsl:for-each-group>
    </Data>
</xsl:template>

How can I fix it to make it work?


person James Taylor    schedule 28.01.2020    source источник
comment
Я попытался изменить xslt-2.0, но получил ошибку при его выполнении.   -  person James Taylor    schedule 28.01.2020
comment
@JamesTaylor Какое сообщение об ошибке?   -  person Alejandro    schedule 28.01.2020
comment
Не удалось сгенерировать XML-документ с использованием предоставленного ввода XML/XSL. org.xml.sax.SAXParseException; номер строки: 1; номер столбца: 20; XML версии 2.0 не поддерживается, поддерживается только XML 1.0   -  person James Taylor    schedule 28.01.2020
comment
Вы поместили версию 2.0 в декларацию XML. Как <?xml version="2.0" encoding="UTF-8"?>. Не.   -  person Alejandro    schedule 28.01.2020
comment
Это не работает..   -  person James Taylor    schedule 28.01.2020
comment
Процессор поддерживает xslt 2.0.   -  person James Taylor    schedule 28.01.2020


Ответы (1)


Результат, который вы показываете, может быть достигнут путем небольшой настройки (и упрощения) вашей таблицы стилей:

XSLT 2.0

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>

<xsl:template match="/Data">
    <Data>
        <xsl:for-each-group select="record" group-by="identifier">
            <records>
                <xsl:copy-of select="current-group()" />
            </records>
        </xsl:for-each-group>
    </Data>
</xsl:template>

</xsl:stylesheet>

Демо: https://xsltfiddle.liberty-development.net/ncnu9B8/1

person michael.hor257k    schedule 28.01.2020
comment
В строке 8 опечатка (записи/запись -> запись). После исправления работает. Спасибо. - person James Taylor; 28.01.2020