2

我正在使用 XSLT 2.0 来执行此操作,我也遇到了类似的问题,但给出的答案无法正常工作。类似的

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>

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

4

2 回答 2

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>
于 2013-11-04T03:43:19.107 回答
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>

让我知道这个是否奏效?应该是我知道的。

于 2013-11-04T03:01:33.833 回答