2011-09-02 26 views
2

我有一個嵌套列表,因此我希望標籤也可以嵌套。帶有數字標籤的嵌套列表

這是我的代碼:

<!-- For first list --> 
<xsl:template name="list1-label"> 
    <xsl:number format="1."/> 
</xsl:template> 

<!-- The nestled list --> 
<xsl:template name="list2-label"> 
    <xsl:number format="1.1."/> 
</xsl:template> 

在最後一個模板( 1.1)我想是相對父項,在這種情況下,第一個數字; 「3」。

下面是XML結構:

<list1> 
    <item>Test</item> 
    <item>Test</item> 
    <list2> 
    <item>Test</item> 
    <item>Test</item> 
    </list2> 
    <item>Test</item> 
</list1> 

這裏是輸出:

1. Test 
2. Test 
    2.1. Test 
    2.2. Test 
3. Test 
+1

提供樣品輸入。 –

回答

1

的有用輸出可以得到(例如)將所述高級屬性@from@count的xsl:number。在這裏工作的例子,從中應該上手:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="list1/item"> 
     <xsl:number level="any" from="list1" count="list1/item"/> 
     <xsl:text>. </xsl:text> 
     <xsl:value-of select="."/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

    <xsl:template match="list1/list2/item"> 
     <xsl:text>&#09;</xsl:text> 
     <xsl:number level="any" from="list1" count="list1/item"/> 
     <xsl:text>.</xsl:text> 
     <xsl:number level="any" from="list2" count="list2/item"/> 
     <xsl:text>. </xsl:text> 
     <xsl:value-of select="."/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

如果你想簡化匹配模式:

<xsl:template match="list1"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="list1/item"> 
    <xsl:number level="any" from="list1" count="list1/item"/> 
    <xsl:text>. </xsl:text> 
    <xsl:value-of select="."/> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

<xsl:template match="list2/item"> 
    <xsl:text>&#09;</xsl:text> 
    <xsl:number level="any" from="list1" count="list1/item"/> 
    <xsl:text>.</xsl:text> 
    <xsl:number level="any" from="list2" count="list2/item"/> 
    <xsl:text>. </xsl:text> 
    <xsl:value-of select="."/> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

這個最新的例子將正確地驅動你進一步嵌套層次與a list3

+1

它成功了!謝謝您的幫助! – Dannie

1

對於嵌套列表,你或許應該使用level="multiple" count="X|Y",但我不能比,如果沒有更精確瞭解(a)您的XML源代碼的樣子,以及(b)在命名模板被調用的地方,上下文項目是什麼。

1

這種新的變換被推廣爲處理可變數目的列表。

輸入樣本:

<list1> 
    <item>Test</item> 
    <item>Test</item> 
    <list2> 
     <item>Test</item> 
     <list3> 
      <item>Test</item> 
      <item>Test</item> 
     </list3> 
     <item>Test</item> 
     <list3> 
      <item>Test</item> 
     </list3> 
     <item>Test</item> 
    </list2> 
    <item>Test</item> 
</list1> 

變換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" omit-xml-declaration="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="*[starts-with(name(),'list')]"> 
     <xsl:apply-templates> 
      <xsl:with-param name="tab" select="true()"/> 
     </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="item"> 
     <xsl:param name="lvl" select="count(ancestor::*)"/> 
     <xsl:param name="tab" select="false()"/> 

     <!-- insert entry point tab --> 
     <xsl:apply-templates select="text()[$tab and $lvl > 1]" mode="tab"> 
      <xsl:with-param name="lvl" select="$lvl - 1"/> 
     </xsl:apply-templates> 

     <!-- recurse levels --> 
     <xsl:variable name="name" select="name(ancestor::*[$lvl])"/> 
     <xsl:number level="any" from="*[name()=$name]" 
      count="*[name()=$name]/item"/> 
     <xsl:text>.</xsl:text> 
     <xsl:apply-templates select="self::item[$lvl > 1]"> 
      <xsl:with-param name="lvl" select="$lvl - 1"/> 
     </xsl:apply-templates> 

     <!-- print value --> 
     <xsl:if test="$lvl = 1"> 
      <xsl:text> </xsl:text> 
      <xsl:value-of select="."/> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="text()" mode="tab"> 
     <xsl:param name="lvl"/> 
     <xsl:text>&#09;</xsl:text> 
     <xsl:apply-templates select="self::text()[$lvl>1]" mode="tab"> 
      <xsl:with-param name="lvl" select="$lvl - 1"/> 
     </xsl:apply-templates> 
    </xsl:template> 

</xsl:stylesheet> 

輸出:

1. Test 
2. Test 
    2.1. Test 
     2.1.1. Test 
     2.1.2. Test 
    2.2. Test 
     2.2.1. Test 
    2.3. Test 
3. Test