Может быть несколько возможностей, как это сделать. Это зависит от того, что сигнализирует уровень заголовка (номер в @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>
Edit: еще одна идеи может быть подсчитать количество Элемент главы "parent", подобный этому
<?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>
Какое исследование вы сделали и что вы пробовали до сих пор? –
Я очень новичок в XSLT. Я пробовал несколько вещей, но всегда получаю то, что я считаю «жестко закодированными» решениями. Я думал, что поставил бы вопрос в чистом виде, не загрязняя его своими (возможно, неправильными) идеями. –