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>

谢谢!

4

1 回答 1

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>
于 2013-09-03T07:13:37.183 回答