テキストが出力されたあと、処理は<xsl:apply-templates/>の部分に移される。というのも、XSLTでのテンプレートの処理の行き来はすべて再帰的に行なわれるためで、1つのテンプレートの処理を終えると、そのテンプレートへと処理が移ったところへ戻ることになる。つまりここでは<xsl:template match="doc">テンプレートの中にある<xsl:apply-templates/>の部分へと戻るわけだ。ここで次にあるのは</文書>というタグで、これもXSLTネームスペースに属していないので、そのまま結果へ出力される。このテンプレートの、ここまでの作業の流れを追ってみると、
- <文書>タグを出力
- 下位ノード(テキストノード)のテンプレートである組み込みテンプレートへと処理が飛ぶ
- docエレメントノードの下にあるテキストノードをそのまま出力
- </文書>タグを出力
というようになる。これによって、以下のような結果がこのテンプレートによって出力される。
<文書>
(docエレメントで括られたテキスト)
</文書>
さて、これでdocエレメントノードにマッチするテンプレートの処理が終わった。テンプレートは再帰的に処理されるので、このテンプレートへ移したエレメントである<xsl:template match="/">の中の<xsl:apply-templates/>の部分へと処理が戻る。これで「/(ドキュメントノード)」にマッチするテンプレートの処理も終わり、すべてのテンプレートの処理が終わったため、めでたくXML文書<doc>(テキスト)</doc>を、<文書>(テキスト)</文書>というようにタグの名前の変換が行なえたわけだ。今回のXMLとXSLTをXSLTプロセッサを使って変換を行なうと、以下のように出力される。
<?xml version="1.0"?>
<文書>
これはテキストです
</文書>
なお今回は、<doc>エレメントノードの下にはテキストノードしかなかったため、テキストノードを処理する組み込みテンプレートルールが適用されたが、もし以下のようになっていた場合はどうなるのだろうか。
<doc>これは<bold>テキスト</bold>です</doc>
select属性のない<xsl:apply-templates/>エレメントは、下位ノードすべてに対応するテンプレートを適用しようとするので、テキストノードに加えて<bold>エレメントノードのテンプレートも探そうとするが、しかしそのテンプレートは存在しない。このような場合、やはり組み込みテンプレートルールによってその内容が自動的に<xsl:apply-templates/>され、その下のテキストノードが自動的に結果として出力される。そのため、やはり<文書>これはテキストです</文書>と出力される。<bold>というタグを<強調>タグに変えたいのなら、以下のようなテンプレートを書き加えておけばよい。
<xsl:template match="bold">
<強調>
<xsl:apply-templates/>
</強調>
</xsl:template>
これで、<xsl:apply-templates/>はboldに対応するテンプレートとして上記のテンプレートを適用し、<xsl:template match="doc">と同じように<bold>エレメントの中にあるテキストを<強調>~</強調>で括った形で出力する。基本的には、タグが増えてもそれに対応するテンプレートを記述しておけば、期待する形で出力できる。