如何使用XSLT 1.0自动生成XHTML标题级别

时间:2013-09-03 06:30:29

标签: xslt xslt-1.0

例如,我该怎么做呢:

<chapter name="Chapter 1">
  <chapter name="Chapter 1.1">
    <chapter name="Chapter 1.1.1">
      <chapter name="Chapter 1.1.1.1"/>
    </chapter>
    <chapter name="Chapter 1.1.2"/>
  </chapter>
  <chapter name="Chapter 1.2"/>
</chapter>

进入这个:

<h1>Chapter 1</h1>
<h2>Chapter 1.1</h2>
<h3>Chapter 1.1.1</h3>
<h4>Chapter 1.1.1.1</h4>
<h3>Chapter 1.1.2</h3>
<h2>Chapter 1.2</h2>

谢谢!

1 个答案:

答案 0 :(得分:3)

如何做到这一点可能有多种可能性。这取决于什么标志着标题的级别(@name属性中的数字?chapter元素的深度?)。

我想这是chapter元素的深度。所以对于输入xml

<?xml version="1.0" encoding="UTF-8"?>
<chapter name="Chapter 1">
    <chapter name="Chapter 1.1">
        <chapter name="Chapter 1.1.1">
            <chapter name="Chapter 1.1.1.1"/>
        </chapter>
        <chapter name="Chapter 1.1.2"/>
    </chapter>
    <chapter name="Chapter 1.2"/>
</chapter>

您可以在连续调用apply-templates

中使用参数增加的模板
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>xxx</title>
            </head>
            <body>
                <xsl:apply-templates select="chapter" />
            </body>
        </html>
    </xsl:template>

    <xsl:template match="chapter">
        <xsl:param name="level" select="1" />

        <xsl:element name="h{$level}">
            <xsl:value-of select="@name" />
        </xsl:element>

        <xsl:apply-templates select="chapter">
            <!-- Increase level of heading -->
            <xsl:with-param name="level" select="$level+1" />
        </xsl:apply-templates>

    </xsl:template>

</xsl:stylesheet>

产生以下输出

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>xxx</title>
    </head>
    <body>
        <h1>Chapter 1</h1>
        <h2>Chapter 1.1</h2>
        <h3>Chapter 1.1.1</h3>
        <h4>Chapter 1.1.1.1</h4>
        <h3>Chapter 1.1.2</h3>
        <h2>Chapter 1.2</h2>
    </body>
</html>

编辑:另一个想法可能是计算像这样的“父”章节元素的数量

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>xxx</title>
            </head>
            <body>
                <xsl:apply-templates select="//chapter" />
            </body>
        </html>
    </xsl:template>

    <xsl:template match="chapter">
        <xsl:variable name="level" select="count(ancestor-or-self::chapter)" />
        <xsl:element name="h{$level}">
            <xsl:value-of select="@name" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>