2011-03-25 4 views
0

몇 가지 도움을 줄 수 있습니다.XSLT 1.0 같은 레벨이지만 다른 값으로 같은 이름의 노드 값을 그룹으로 묶기

<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 그룹 (이다 : A는 내 XSLT의 예 버전을 손질

<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> 

은 다음과 같다 : 여기

내 XML의 예시입니다 색상 노드에 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> 

을 지금까지 내 공동 de는 이것을 할 수 있지만 첫 번째 항목 만 가져옵니다. 즉, 위의 예에서 내 출력 현재 : 해결책이 발생 이유에 대한 설명에

<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

관련 문제