2011-03-25 78 views
0

我可以使用一些幫助。XSLT 1.0對具有相同級別但不同值的同名節點的值進行分組

這裏是我的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)&gt;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> 

幫助上一個解決方案,爲什麼出現這種情況的解釋將不勝感激。

謝謝! 傑夫

回答

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(.)&gt;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> 
+0

感謝後,這對我幫助很大。 – erichert 2013-07-11 15:31:34

相關問題