嵌套 XML XSLT 1.0 转换

Nested XML XSLT 1.0 transform

我是初学者,我想知道如何使用 XSLT 1.0 转换来转换以下 XML 格式。

<project>
        <item>
            <id>123</id>
            <name>abc</name>
            <category>list</category>
        </item>
        <item>
            <id>456</id>
            <name>def</name>
            <category>object</category>
        </item>
        <item>
            <id>789</id>
            <name>dfd</name>
            <category>list</category>
        </item>
        <item>
            <id>111</id>
            <name>SC, CM</name>
            <category>object</category>
        </item>
    </project>

以下 xml 形式,其中 xml 元素根据其独特类别进行分组。

<?xml version="1.0" ?>
<project xmlns="">
    <findings>
        <finding>
            <category>list</category>
            <id>123</id>
            <name>abc</name>
            <id>789</id>
            <name>dfd</name>
        </finding>
        <finding >
            <category>object</category>
            <id>456</id>
            <name>def</name>
            <id>111</id>
            <name>SC, CM</name>
        </finding>
<findings>
</project>

我知道这将是最糟糕的实施方式,但是,这是我到目前为止尝试过的方法:

   <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <project xmlns="xyz.com">
    <xsl:key name="keyCategory" match="item" use="category" />
    <findings>
    <xsl:for-each select="//item[generate-id(.) = generate-id(key('keyCategory)', category)[1])]">
    <finding>
                <category><xsl:value-of select="category"/></category>
                <id><xsl:value-of select="id"/></id>
                <name><xsl:value-of select="name"/></name>
        </finding></xsl:for-each>
    <findings>
    </project>
</xsl:template>
</xsl:stylesheet>

试试这个:

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

    <xsl:output indent="yes"/>

    <xsl:key name="keyCategory" match="item" use="category"/>

    <xsl:template match="/">
        <project xmlns="xyz.com">
            <findings>
                <xsl:for-each
                    select="//item[generate-id(.) = generate-id(key('keyCategory', category)[1])]">
                    <finding>
                        <category>
                            <xsl:value-of select="category"/>
                        </category>
                        <xsl:for-each select="key('keyCategory', category)">
                            <id>
                                <xsl:value-of select="id"/>
                            </id>
                            <name>
                                <xsl:value-of select="name"/>
                            </name>
                        </xsl:for-each>
                    </finding>
                </xsl:for-each>
            </findings>
        </project>
    </xsl:template>
</xsl:stylesheet>

参见 https://xsltfiddle.liberty-development.net/94AcskZ

处的转换