XSLT - 对相同的项目进行分组

时间:2009-09-24 18:55:43

标签: xslt

我有以下XML:

  <Info>
    <Name>Dan</Name>
    <Age>24</Age>
  </Info>
  <Info>
    <Name>Tom</Name>
    <Age>15</Age>
  </Info>
  <Info>
    <Name>Dan</Name>
    <Age>24</Age>
  </Info>
  <Info>
    <Name>James</Name>
    <Age>18</Age>
  </Info>

我需要制作以下HTML:

<ul class="data">
<li>Dan</li>
<li>Dan</li>
</ul>

<ul class="data">
<li>James</li>
</ul>

<ul class="data">
<li>Tom</li>
<li>Tom</li>
</ul>

除了生成输出外,还需要根据名称进行排序。任何帮助表示赞赏,通过查看分组开始,但无法确定如何完成它:

非常肯定是错的?

<xsl:for-each-group select="Info" group-by="@Name">??????
<xsl:for-each-group select="current-group()" sort-by="@Name">

3 个答案:

答案 0 :(得分:2)

我没有XSLT 2.0解析器,但要在XSLT 1.0中完成,至少可以使用Muenchian Grouping来执行此操作...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output encoding="utf-8" method="html" version="1.0"/>

    <xsl:key name="Names" match="Name" use="."/>

    <xsl:template match="/">
        <xsl:for-each select="//Info[generate-id(Name) = generate-id(key('Names', Name)[1])]">
        <xsl:sort select="Name" />
        <ul class="data">
            <xsl:for-each select="key('Names', Name)">
            <li><xsl:value-of select="." /></li>
            </xsl:for-each>
            </ul>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

我不确定为什么你的结果有两个'Tom'元素,我假设你在XML中有一个你未在样本中提供的额外节点。

无论如何,XSLT看起来像这样:

<xsl:for-each-group select="Info" group-by="Name">
    <xsl:sort select="current-grouping-key()"/>
    <ul class="data">
    <xsl:for-each select="current-group()/Name">
        <li><xsl:value-of select="." /></li>
    </xsl:for-each>
    </ul>
</xsl:for-each-group>

我没有方便的XSLT 2.0解析器来测试它,但我认为这应该可行。

答案 2 :(得分:0)

我没有xslt 2.0解析器来测试它,但至少你需要将"@Name"更改为"Name",因为它是一个子元素而不是属性。