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::*
の省略なので、当然エレメントノードのみがマッチする。