我有以下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">
答案 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"
,因为它是一个子元素而不是属性。