2011-11-08 31 views
0

我有这样的XML数据:创建XSLT为组数据

<data ItemCount="5"> 
<zrow GroupName="Manager"User="User1" /> 
<zrow GroupName="Developer"User="User2" /> 
<zrow GroupName="Manager"User="User3" /> 
<zrow GroupName="CEO"User="User4" /> 
<zrow GroupName="CEO"User="User5" /> 
</data> 

我想这样的输出:

Manager 

User1 

User3 

Developer 

User2 

CEO 

User4 

User5 

什么应该是我的XSLT?我想创建一个XSLT,它应该将我的数据转换为上述格式。你能帮我创建一个吗?

+0

哪个XSLT的版本? –

回答

1

的XSLT 2.0溶液:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="data"> 
     <xsl:for-each-group select="zrow" group-by="@GroupName"> 
      <xsl:value-of select="current-grouping-key()" /> 
      <xsl:text>&#xa;</xsl:text> 
      <xsl:value-of select="current-group()/@User" separator="&#xa;"/> 
      <xsl:text>&#xa;</xsl:text> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

的XSLT 1.0解决方案依赖于Muenchian方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:key name="byGroupName" match="zrow" use="@GroupName"/> 
    <xsl:template 
     match="zrow[generate-id()= 
        generate-id(key('byGroupName', @GroupName)[1])]"> 
     <xsl:value-of select="@GroupName"/> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:apply-templates select="key('byGroupName', @GroupName)" mode="out"/> 
    </xsl:template> 
    <xsl:template match="zrow" mode="out"> 
     <xsl:value-of select="@User"/> 
     <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 
    <xsl:template match="zrow"/> 
</xsl:stylesheet> 
+0

你可以给出输出为HTML吗? – NICK

+0

这适用于如果我的GroupName字段填充了一些值。如果GoupName的值没有任何值,你能否更新代码来管理? – NICK

+0

@NICK - SO上有很多很多的分组问题。这是最常见的问题之一。我建议您搜索关于Muenchian方法(如果您使用XSLT 1.0)或一般分组的更多信息。找到很多好的例子你应该没有问题。作为一个提示,使用其他HTML元素来包装诸如''这样的行应该非常简单:'

  • ' –