Xslt 2.0 分组与身份转换

Xslt 2.0 分组与身份转换,xslt-2.0,xslt-grouping,Xslt 2.0,Xslt Grouping,如何同时应用身份转换和分组 <items> <user> <id>8788989</id> <firstname>test</firstname> <lastname>user</lastname> </user> <info>test xml</info>

如何同时应用身份转换和分组

  <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>

8788989
测试
用户
测试xml
1.
2.
3.
3.
我希望输出为

 <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>

8788989
测试
用户
测试xml
1.
2.
3.
3.

分组是在item/@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>


xsl:apply templates select=“../item[@id=current()/@id]”每个组的
内部
应该只使用
xsl:apply templates select=“current-group()”
,在所有XSLT处理器已经计算出组并使其可用于该函数之后,无需使用XPath选择节点。