テンプレートマッチングを使用して目的を達成する方がよい場合があります。これは、XSLTの精神に基づいているためです。
たとえば、「子」要素を一致させるには、どのような名前でもかまいませんが、次のようにして、最上位要素の子要素を一致させることができます。
<xsl:template match="/*/*">
<h1>
<!-- Output name here -->
</h1>
<xsl:apply-templates />
</xsl:template>
同様に、孫の要素を一致させるには、これを使用します
<xsl:template match="/*/*/*">
段落に関しては、テキストノードに一致するテンプレートがあります
<xsl:template match="text()">
<p>
<xsl:value-of select="normalize-space(.)" />
</p>
</xsl:template>
これが完全なXSLTです
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output version="4.0" method="html" indent="no" encoding="UTF-8" use-character-maps="spaces" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"/>
<xsl:template match="/*">
<html>
<head>
<title>Abschlussarbeit</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="/*/*">
<h1>
<xsl:value-of select="concat(translate(substring(name(), 1, 1), abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ), substring(name(), 2))"/>
</h1>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="/*/*/*">
<h2>
<xsl:value-of select="concat(translate(substring(name(), 1, 1), abcdefghijklmnopqrstuvwxyz, ABCDEFGHIJKLMNOPQRSTUVWXYZ), substring(name(), 2))"/>
</h2>
<xsl:apply-templates />
</xsl:template>
<xsl:template match="text()">
<p>
<xsl:value-of select="normalize-space(.)" />
</p>
</xsl:template>
</xsl:stylesheet>
XMLに適用すると、次のように出力されます。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html">
<title>Abschlussarbeit</title>
</head>
<body>
<h1>child1</h1>
<p>Some text</p>
<h1>child2</h1>
<h2>grandchild1</h2>
<p>Some text</p>
</body>
</html>
XSLT 2.0を使用している場合は、XSLT 1.0で使用されている「変換」メソッドを使用するのではなく、要素名の最初の文字を大文字に変換するために使用できるxpath関数「大文字」があることに注意してください。