分组和身份转换

Grouping and Identity transformation

如何同时应用恒等变换和分组

  <items>
        <user>
          <id>8788989</id>
         <firstname>test</firstname>
         <lastname>user</lastname>
        </user>
        <info>test xml</info>
        <fromdate><fromdate>
        <todate></todate>

        <item id="123" name="Java">
            <price>1</price>
            <description></description> 
        </item>

        <item id="123" name="Java and XML">
            <price>2</price>
            <description></description> 
        </item>

        <item id="234" name="python">
            <price>3</price>
            <description></description> 
        </item>

        <item id="234" name="scala">
            <price>3</price>
            <description></description> 
        </item>

      </items>

我想要输出为

 <items>
        <user>
          <id>8788989</id>
         <firstname>test</firstname>
         <lastname>user</lastname>
        </user>
        <info>test xml</info>
        <fromdate><fromdate>
        <todate></todate>
         <group>  
            <item id="123" name="Java">
                <price>1</price>
                <description></description> 
            </item>

            <item id="123" name="Java and XML">
               <price>2</price>
               <description></description> 
            </item>
        </group>

        <group>
           <item id="234" name="python">
              <price>3</price>
              <description></description> 
           </item>

           <item id="234" name="scala">
              <price>3</price>
              <description></description> 
           </item>
       </group>
   </items>

对项目/@id 进行分组

你可以这样分组:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="items">
        <items>
            <xsl:apply-templates select="* except item"/>
            <xsl:for-each-group select="item" group-by="@id">
                <group>
                    <xsl:apply-templates select="../item[@id = current()/@id]"/>
                </group>
            </xsl:for-each-group>
        </items>
    </xsl:template>

</xsl:stylesheet>

更新的答案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="items">
        <items>
            <xsl:apply-templates select="* except item"/>
            <xsl:for-each-group select="item" group-by="@id">
                <group>
                    <xsl:apply-templates select="current-group()"/>
                </group>
            </xsl:for-each-group>
        </items>
    </xsl:template>

</xsl:stylesheet>