例如,我该怎么做呢:
<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>
谢谢!
答案 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>