2011-01-24 1 views
1

Привет я немного застрял с этой проблемой мой XML является, какГруппировка с помощью атрибута в XSLT

<album> 
    <title>album name</title>  
    <tracks> 
      <track tracksequence="1" disksequence="1">track 1 - disc 1</track> 
      <track tracksequence="2" disksequence="1">track 2 - disc 1</track> 
      <track tracksequence="3" disksequence="1">track 3 - disc 1</track> 
      <track tracksequence="1" disksequence="2">track 1 - disc 2</track> 
      <track tracksequence="2" disksequence="2">track 2 - disc 2</track> 
      <track tracksequence="3" disksequence="2">track 3 - disc 2</track> 
      <track tracksequence="4" disksequence="2">track 4 - disc 2</track> 
      <track tracksequence="1" disksequence="3">track 1 - disc 3</track> 
      <track tracksequence="2" disksequence="3">track 2 - disc 3</track> 
    </tracks> 
</album> 

я хотел бы иметь возможность выхода в

<div> 
<span>album name disc 1</span> 
track 1 disc 1 
track 2 disc 1 
track 3 disc 1 
</div> 

<div> 
<span>album name disc 2</span> 
track 1 disc 2 
track 2 disc 2 
track 3 disc 2 
track 4 disc 2 
</div> 

ect... 

я уверен, что мне нужно использовать какую-то группировку Muenchian, но им трудно сбивать голову вокруг нее для моего конкретного использования.

ответ

3
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="yes"/> 

<xsl:key name="sortByDisk" match="track" use="@disksequence"/> 

<xsl:template match="/*"> 
    <body> 
     <xsl:apply-templates select="tracks/track[ 
      count(. | key('sortByDisk', @disksequence)[1]) = 1 
     ]"/> 
    </body> 
</xsl:template> 

<xsl:template match="track"> 
    <div> 
     <span> 
      <xsl:value-of select="../../title"/> 
      <xsl:text> disc</xsl:text> 
      <xsl:value-of select="@disksequence"/> 
     </span> 
     <xsl:apply-templates select="key('sortByDisk', @disksequence)" 
      mode="inner"/> 
    </div> 
</xsl:template> 

<xsl:template match="track" mode="inner"> 
    <p><xsl:value-of select="."/></p> 
</xsl:template> 

</xsl:stylesheet> 

Output (используя образец):

<body> 
    <div> 
     <span>album name disc1</span> 
     <p>track 1 - disc 1</p> 
     <p>track 2 - disc 1</p> 
     <p>track 3 - disc 1</p> 
    </div> 
    <div> 
     <span>album name disc2</span> 
     <p>track 1 - disc 2</p> 
     <p>track 2 - disc 2</p> 
     <p>track 3 - disc 2</p> 
     <p>track 4 - disc 2</p> 
    </div> 
    <div> 
     <span>album name disc3</span> 
     <p>track 1 - disc 3</p> 
     <p>track 2 - disc 3</p> 
    </div> 
</body> 
+0

спасибо большое за этот Флэк, хотя в моем живом примере мой шаблон разве применяя к моей дорожке, то есть в вашем примере режим дорожки = «внутренний» не знаю, почему это так, хотя он выводит все данные из узла./head царапина! – Treemonkey

+0

@Treemonkey, вам удалось реализовать решение? У меня нет проблем с добавлением изменений, если вы публикуете свой текущий код. – Flack

+0

спасибо, я думаю, что это, вероятно, что-то довольно простое, заставляя его сломаться. проблема выше очень упрощена! скоро будет обновляться, только имея чашку и убедившись, что у меня все правильно! – Treemonkey