XSLT嵌套TOC

时间:2014-12-17 14:09:47

标签: xml xslt

它应解析XML-File中的内容表,并输出带有有序List的HTML。 我试过类似下面的东西,但它显示重复的条目(第一个标题两次)和一个空的li标签,我无法弄清楚如何删除它们。

我的XML:

<?xml version="1.0" encoding="UTF-8" ?>
<document>
    <section>
        <title>Section One</title>
    </section>
    <section>
        <title>Section Two</title>
        <section>
            <title>Section Two.One</title>
        </section>
        <section>
            <title>Section Two.Two</title>
            <section>
                <title>Section Two.Two.One</title>
            </section>
        </section>
    </section>
    <section>
        <title>Section Three</title>
    </section>
</document>


My XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="document">
        <html>

        <head>
        </head>

        <body>
            <ol>
                <xsl:apply-templates/>
            </ol>
        </body>

        </html>
    </xsl:template>

    <xsl:template match="section">
        <li>

            <xsl:value-of select="title" />
            <xsl:if test="section">
                <ol>
                    <li>
                        <xsl:apply-templates select="title" />
                        <xsl:if test="section">
                            <li>

                                <xsl:apply-templates select="section" />
                            </li>
                        </xsl:if>

                    </li>
                </ol>
            </xsl:if>
        </li>

    </xsl:template>

</xsl:stylesheet>

输出:

xslt output

这可能是分组问题吗?我有顺序元素,我想嵌套它没有空li标签。非常感谢任何想法。

1 个答案:

答案 0 :(得分:1)

我相信你让它变得比它需要的更复杂。试试这种方式:

<xsl:template match="/document">
    <html>
        <head>
        </head>
        <body>
            <ol>
                <xsl:apply-templates select="section" />
            </ol>
        </body>
    </html>
</xsl:template>

<xsl:template match="section">
    <li>
        <xsl:value-of select="title" />
        <xsl:if test="section">
            <ol>
                <xsl:apply-templates select="section" />
            </ol>
        </xsl:if>  
    </li>
</xsl:template>