我可以使用一些帮助。
以下是我的XML的说明性示例:
<items>
<item>
<name>Thing 1</name>
<colors>
<color>white</color>
<color>green</color>
</colors>
</item>
<item>
<name>Thing 2</name>
<colors>
<color>purple</color>
<color>white</color>
<color>black</color>
</colors>
</item>
<item>
<name>Thing 3</name>
<colors/>
</item>
</items>
我的xslt的精简版示例版本如下:
<xsl:key name="myGrouping" use="colors/color" match="item"/>
<xsl:template match="/">
<xsl:apply-templates select="items" mode="groupingTemplate"/>
</xsl:template>
<xsl:template mode="groupingTemplate" match="items">
<xsl:for-each select="item[count(.|key('myGrouping',colors/color)[1])=1]">
<xsl:sort select="colors/color"/>
<xsl:if test="count(colors/color)>0">
<p><xsl:value-of select="colors/color"/></p>
<xsl:for-each select="key('myGrouping',colors/color)">
<xsl:sort select="name"/>
<li><xsl:value-of select="name"/></li>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:template>
我想要做的是在颜色节点上使用XSLT 1.0(使用Muenchian方法)进行分组,所以我的html输出将是:
<p>black</p>
<li>Thing 2</li>
<p>green</p>
<li>Thing 1</li>
<p>purple</p>
<li>Thing 2</li>
<p>white<p>
<li>Thing 1</li>
<li>Thing 2</li>
到目前为止,我的代码可以执行此操作,但只能获取第一个条目。换句话说,在上面的示例中,我的输出当前是:
<p>white</p>
<li>Thing 1</li>
<li>Thing 2</li>
非常感谢帮助解决方案和解释为什么会发生这种情况。
谢谢! 杰夫
答案 0 :(得分:2)
经过多次拔毛后想出来......下面的xsl可以解决这个问题
<xsl:key name="byColor" use="." match="item/colors/color"/>
<xsl:template match="/">
<xsl:apply-templates select="items" mode="groupingTemplate"/>
</xsl:template>
<xsl:template mode="groupingTemplate" match="items">
<xsl:for-each select="item/colors/color[count(.|key('byColor',.)[1])=1]">
<xsl:sort select="."/>
<xsl:if test="count(.)>0">
<p><xsl:value-of select="."/></p>
<xsl:for-each select="key('byColor',.)">
<xsl:sort select="../../name"/>
<li><xsl:value-of select="../../name"/></li>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:template>