Xml 带数字标签的嵌套列表

Xml 带数字标签的嵌套列表,xml,xslt,xpath,xsl-fo,Xml,Xslt,Xpath,Xsl Fo,我有一个嵌套列表,因此我希望标签也嵌套 这是我的代码: <!-- For first list --> <xsl:template name="list1-label"> <xsl:number format="1."/> </xsl:template> <!-- The nestled list --> <xsl:template name="list2-label"> <xsl:number fo

我有一个嵌套列表,因此我希望标签也嵌套

这是我的代码:

<!-- 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>

对于嵌套列表,您可能应该使用
level=“multiple”count=“X | Y”
,但如果不知道(a)您的XML源是什么样的,以及(b)在调用命名模板时上下文项是什么,我就不能比这更精确了。

可以获得所需的输出(例如)应用
xsl:number
@from@count的高级属性。下面是一个工作示例,您可以从中开始:

<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>

. 


	
.
. 



这个最新的示例将正确地驱动您进一步嵌套级别,就像使用列表3

一样。这个新的转换被推广到处理可变数量的列表

输入样本:

<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: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>
<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