带有数字标签的嵌套列表

时间:2011-09-02 14:02:00

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

3 个答案:

答案 0 :(得分:1)

对于嵌套列表,你可能应该使用level="multiple" count="X|Y"但是如果不知道(a)你的XML源是什么样的,以及(b)上下文项是什么,我就不能更精确。指向您的命名模板的位置。

答案 1 :(得分:1)

可以获取所需的输出(例如)应用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>

这个最新的示例将正确地推动您进一步嵌套级别,就像 list3 一样。

答案 2 :(得分: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