XSLTでnode()および*を使う際の注意。省略形でないXpathの知識が必要。
node()
<xsl:template match="node()">と書いた場合、「node()は全てのノードタイプにマッチするから属性もこのテンプレートで処理されるはずだ」と勘違いしてしまうことがある。実際にやってみると分かるが、このテンプレートは期待通りには動作しない。
ノードテストとしてのnode()は全てのノードタイプにマッチする。しかし、パターン内に単体で存在するnode()は単なる省略表記なので実際はchild::node()を意味する(ロケーションステップは「軸::ノードテスト[述部]」と定義されている事を思い出して欲しい)。
属性はchild軸ではなくattribute軸なので当然上記のようなテンプレートのパターンにはマッチしない事が分かる。
似た例としてxsl:apply-templatesでselect属性を省略すると全ての子ノードが処理されるが、これは軸がchildであることを意味しているので、attribute軸にある属性ノードは一切処理されない。
*も混乱の元になる。ノードテストの*はその軸の主ノード型なら全てのノードにマッチする。child軸ならエレメントノードが主ノード型なので、child::*は全ての子エレメントーノードを選択する。つまりchild::node()と違い、テキストノードやコメントノードは例え子供にいたとしても選択されない。また、省略表記で*が単独で存在した場合もchild::*の省略なので、当然エレメントノードのみがマッチする。