2013-10-24 68 views
0

我碰到過這樣的小問題而創建的XSLT文件...我有這個通用的XML文件:XSLT:多個表

<data> 
    <folder> 
    <file> 
     <name>file1</name> 
     <date>2000</date> 
     <index1>1</index1> 
     <index2>1</index2> 
    </file> 

    <file> 
     <name>file2</name> 
     <date>2001</date> 
     <index1>1</index1> 
     <index2>1</index2> 
    </file> 

    <file> 
     <name>file3</name> 
     <date>2004</date> 
     <index1>2</index1> 
     <index2>1</index2> 
    </file> 
    </folder> 
</data> 

鑑於這種抽象的例子,我把它改造成類似:

<table> 
    <tr> 
    <td>Name</td> 
    <td>Date</td> 
    </tr> 
    <tr> 
    <td>file1</td> 
    <td>2000</td> 
    </tr> 
    <tr> 
    <td>file2</td> 
    <td>2001</td> 
    </tr> 
</table> 

<table> 
    <tr> 
    <td>Name</td> 
    <td>Date</td> 
    </tr> 
    <tr> 
    <td>file3</td> 
    <td>2004</td> 
    </tr> 
</table> 

我必須根據它們的index1和index2(如ID對)將每個表的文件元素分組。我能夠爲每個分離的文件創建一個表,但我無法提供解決方案爲每個共享index1和index2的文件創建一個表。任何想法或建議?

+0

您是使用XSLT 1.0還是使用2.0?有兩種解決方案,但XSLT 2更簡單。 –

+0

我正在使用XSLT 2.0。 –

+0

你的生活變得更容易:) –

回答

0

由於您使用的是XSLT 2.0,因此您可以使用xsl:for-each-group聲明。在這裏你有兩個選擇,取決於你是否希望將組保持在一起並尊重序列,或者你是否想要不管序列進行分組。

也就是說,給定aabaab是否需要(aaaa, bb)(aa, b, aa, b)組?

這第一組與文件在同一index1index2不管順序(我已經把在body元素只是爲了讓合格的)

<xsl:template match="folder"> 
    <body> 
    <xsl:for-each-group select="file" group-by="concat(index1, '-', index2)"> 
     <!-- xsl:for-each-group sets the first element in the group as the context node --> 
     <xsl:apply-templates select="."/> 
    </xsl:for-each-group> 
    </body> 
</xsl:template> 

<xsl:template match="file"> 
    <table> 
     <tr> 
      <td>Name</td> 
      <td>Date</td> 
     </tr> 
     <xsl:apply-templates select="current-group()" mode="to-row"/> 
    </table> 
</xsl:template> 

<xsl:template match="file" mode="to-row"> 
    <tr> 
     <xsl:apply-templates select="name|date"/> 
    </tr> 
</xsl:template> 

<xsl:template match="name|date"> 
    <td><xsl:apply-templates/></td> 
</xsl:template> 

第二個版本將所有文件中的元素只需要將第一個模板更改爲:

<xsl:template match="folder"> 
    <body> 
    <xsl:for-each-group select="file" group-adjacent="concat(index1, '-', index2)"> 
     <xsl:apply-templates select="."/> 
    </xsl:for-each-group> 
    </body> 
</xsl:template> 
+0

感謝您的幫助!這很有道理! 我想知道如何在1.0中看到相同的問題。 –

+1

@theTech在XSLT 1.0中,將使用Muenchian方法。如果你對此感興趣,那麼有很多關於SO的問題。 XSLT 2.0使這更容易。 –

+0

@MatthewGreen我看了一下這個方法。很高興知道他們在2.0版本中改進了這個問題! –