ノードテストと省略形

ページ情報
制作日
2004-05-31
最終更新日
2004-05-31
参照用URI
http://www.arielworks.net/articles/2004/0531a
分野

XSLTでnode()および*を使う際の注意。省略形でないXpathの知識が必要。

node()

<xsl:template match="node()">と書いた場合、「node()は全てのノードタイプにマッチするから属性もこのテンプレートで処理されるはずだ」と勘違いしてしまうことがある。実際にやってみると分かるが、このテンプレートは期待通りには動作しない。

ノードテストとしてのnode()は全てのノードタイプにマッチする。しかし、パターン内に単体で存在するnode()単なる省略表記なので実際はchild::node()を意味する(ロケーションステップは「軸::ノードテスト[述部]」と定義されている事を思い出して欲しい)。

属性はchild軸ではなくattribute軸なので当然上記のようなテンプレートのパターンにはマッチしない事が分かる。

似た例としてxsl:apply-templatesselect属性を省略すると全てのノードが処理されるが、これは軸がchildであることを意味しているので、attribute軸にある属性ノードは一切処理されない。

*

*も混乱の元になる。ノードテストの*はその軸の主ノード型なら全てのノードにマッチする。child軸ならエレメントノードが主ノード型なので、child::*は全ての子エレメントーノードを選択する。つまりchild::node()と違い、テキストノードやコメントノードは例え子供にいたとしても選択されない。また、省略表記で*が単独で存在した場合もchild::*の省略なので、当然エレメントノードのみがマッチする。

連絡先、リンク、転載や複製などについては「サイト案内」をご覧ください。Powered by HIMMEL