2013-07-24 62 views
1

我有一個看起來像這樣一些XML數據在HTML列表:分組按類別和子類別,以從XML數據

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="course-catalog.xsl"?> 

<catalog> 
    <course> 
     <category>Category 1</category> 
     <subcategory>Sub 1</subcategory> 
     <name>test name 1</name> 
     <instructor>fred derp</instructor> 
     <date>July 1</date> 
     <url>http://foo.com</url> 
    </course> 

<course> 
    <category>Category 1</category> 
    <subcategory>Sub 2</subcategory> 
    <name>test name 2</name> 
    <instructor>john bravo</instructor> 
    <date>March 19, 2008</date> 
    <url>www.foorl.com/foo.html</url> 
</course> 

<course> 
    <category>Category 2</category> 
    <subcategory>Sub 1</subcategory> 
    <name>test name 3</name> 
    <instructor>Jack Nicholson</instructor> 
    <date>July 2</date> 
    <url>test.html</url> 
</course> 

<course> 
    <category>Category 2</category> 
    <subcategory>Sub 1</subcategory> 
    <name>test name 4</name> 
    <instructor>Jim Carrey</instructor> 
    <date>July 21</date> 
    <url>test3.html</url> 
</course> 




</catalog> 

我希望它按類別和子類別組(只用H1 H2類別和子類別的標籤以及下面的課程數據的其餘部分)。

使用我提供的XML數據,它應該產生:

Category 1 
    Sub 1 
    test name 1, fred derp, July 1 

    Sub 2 
    test name 2, john bravo, March 19, 2008 

Category 2 
    Sub 1 
.... 
... 

所以它應該有一個組,使用XSL子組。它不必在表格或任何東西中,只是一個普通的HTML列表。

我嘗試過使用本網站的示例,並找不到任何適用於我需要做的事情。我也嘗試過W3學校,它只是展示了一個使用CD的例子,並且根本沒有分組。

任何幫助將不勝感激!

+0

你有什麼試過,這不工作?你可以用你的course_catalog.xsl更新這個問題嗎? –

+0

我使用了xsl:for-each-group,但是我無法讓它工作。 –

回答

0

在標記了「Muenchian-grouping」後,我假設您需要XSLT 1.0中的解決方案。在XSLT 2.0中分組解決方案總是更容易。

對於XSLT 1.0中的多級分組,我更喜歡使用基於變量的分組方法而不是基於Muenchian基於鍵的分組方法,承認它可能執行較慢但更易於理解編碼。

t:\ftemp>type armando.xml 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="course-catalog.xsl"?> 

<catalog> 
    <course> 
     <category>Category 1</category> 
     <subcategory>Sub 1</subcategory> 
     <name>test name 1</name> 
     <instructor>fred derp</instructor> 
     <date>July 1</date> 
     <url>http://foo.com</url> 
    </course> 

<course> 
    <category>Category 1</category> 
    <subcategory>Sub 2</subcategory> 
    <name>test name 2</name> 
    <instructor>john bravo</instructor> 
    <date>March 19, 2008</date> 
    <url>www.foorl.com/foo.html</url> 
</course> 

<course> 
    <category>Category 2</category> 
    <subcategory>Sub 1</subcategory> 
    <name>test name 3</name> 
    <instructor>Jack Nicholson</instructor> 
    <date>July 2</date> 
    <url>test.html</url> 
</course> 

<course> 
    <category>Category 2</category> 
    <subcategory>Sub 1</subcategory> 
    <name>test name 4</name> 
    <instructor>Jim Carrey</instructor> 
    <date>July 21</date> 
    <url>test3.html</url> 
</course> 

</catalog> 
t:\ftemp>call xslta armando.xml armando.txt 
Producing armando.txt... 

t:\ftemp>type armando.txt 

Category 1 
    Sub 1 
    test name 1, fred derp, July 1 
    Sub 2 
    test name 2, john bravo, March 19, 2008 

Category 2 
    Sub 1 
    test name 3, Jack Nicholson, July 2 
    test name 4, Jim Carrey, July 21 

t:\ftemp>type course-catalog.xsl 
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

<xsl:output method="text"/> 

<xsl:template match="catalog"> 
    <xsl:variable name="categories" select="course"/> 
    <xsl:for-each select="$categories"> 
    <xsl:if test="generate-id(.)= 
        generate-id($categories[category=current()/category][1])"> 
     <xsl:variable name="subs" 
        select="$categories[category=current()/category]"/> 
     <xsl:text>&#xa;</xsl:text> 
     <xsl:value-of select="category"/> 
     <xsl:for-each select="$subs"> 
     <xsl:if test="generate-id(.)= 
         generate-id($subs[subcategory=current()/subcategory][1])"> 
      <xsl:text>&#xa; </xsl:text> 
      <xsl:value-of select="subcategory"/> 
      <xsl:for-each select="$subs[subcategory=current()/subcategory]"> 
      <xsl:text>&#xa; </xsl:text> 
      <xsl:value-of select="concat(name,', ',instructor,', ',date)"/> 
      </xsl:for-each> 
     </xsl:if> 
     </xsl:for-each> 
     <xsl:text>&#xa;</xsl:text> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
t:\ftemp>rem Done! 
+1

哇,它的作品就像一個魅力!非常感謝!!!如果我能付給你我會:) –