2011-01-24 73 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> 

输出(使用您的样品):

<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

非常感谢该高炮,虽然在我的活生生的例子我的模板心不是适用于我的轨迹,即在你的榜样跟踪模式=“内”不知道这是为什么,尽管它正在输出节点中的所有数据。 /头刮! – Treemonkey 2011-01-24 13:48:45