使用group-by对元素进行分组

时间:2013-11-04 02:58:25

标签: xml xslt xslt-2.0

我正在使用XSLT 2.0来做到这一点我也遇到了类似的问题,但给出的答案都没有正常工作。 Similar One

XML

<Users>
 <User id="1" name="TYE" Division="Admin"/> 
 <User id="2" name="ANN" Division="HR"/> 
 <User id="3" name="LAR" Division="Marketing"/> 
 <User id="4" name="JSN" Division="Admin"/> 
</Users>

需要这样的输出;

<AllUsers>
 <Division value="HR">
  <User> 
   <id>2</id>
   <name>TYE</name>
  </User> 
  <User> 
   <id>5</id>
   <name>JSN</name>
  </User>
 </Division>
 <Division value="ADMIN">
  <User> 
   <id>3</id>
   <name>ANN</name>
  </User> 
 </Division>
 <Division value="Marketing">
  <User> 
   <id>4</id>
   <name>LAR</name>
  </User> 
 </Division>
</AllUsers>

需要按部门分组..谢谢。

2 个答案:

答案 0 :(得分:2)

这是另一个更像推送风格的选择......

XML输入

<Users>
 <User id="1" name="TYE" Division="Admin"/> 
 <User id="2" name="ANN" Division="HR"/> 
 <User id="3" name="LAR" Division="Marketing"/> 
 <User id="4" name="JSN" Division="Admin"/> 
</Users>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="/*">
        <AllUsers>
            <xsl:for-each-group select="User" group-by="@Division">
                <Division value="{current-grouping-key()}">
                    <xsl:apply-templates select="current-group()"/>
                </Division>
            </xsl:for-each-group>
        </AllUsers>
    </xsl:template>

    <xsl:template match="User/@*">
        <xsl:element name="{name()}">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@Division" priority="1"/>

</xsl:stylesheet>

<强>输出

<AllUsers>
   <Division value="Admin">
      <User>
         <id>1</id>
         <name>TYE</name>
      </User>
      <User>
         <id>4</id>
         <name>JSN</name>
      </User>
   </Division>
   <Division value="HR">
      <User>
         <id>2</id>
         <name>ANN</name>
      </User>
   </Division>
   <Division value="Marketing">
      <User>
         <id>3</id>
         <name>LAR</name>
      </User>
   </Division>
</AllUsers>

答案 1 :(得分:1)

这就是我要做的,

<?xml version="1.0" encoding="UTF-8"?>
<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:key name="division" match="User" use="@Division" />
   <xsl:template match="Users">
      <xsl:element name="AllUsers">
         <xsl:for-each-group select="*" group-by="@Division">
            <xsl:element name="Division">
               <xsl:attribute name="value">
                  <xsl:value-of select="@Division" />
               </xsl:attribute>
               <xsl:for-each select="current-group()">
                  <xsl:element name="User">
                     <xsl:element name="id">
                        <xsl:value-of select="@id" />
                     </xsl:element>
                     <xsl:element name="name">
                        <xsl:value-of select="@name" />
                     </xsl:element>
                  </xsl:element>
               </xsl:for-each>
            </xsl:element>
         </xsl:for-each-group>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

让我知道这是否有效?应该如我所知。