Jintrick.netagenda2003年09月アーカイブ → 2003年09月30日

self軸をQNameによる要素型の検査に使う(XPath1.0)

自分自身(カレントノードやコンテクストノード)の要素型を調べる用途でself軸を使うことが出来ます。例:

<xsl:if test="self::html:image">
	<xsl:message terminate="yes">image要素型を検知</xsl:message>
</xsl:if>
<!-- 祖先要素に xmlns:html="http://www.w3.org/1999/xhtml" があると仮定 -->

カレントノードがXHTMLの名前空間のimage要素であるかどうかを、QNameを用いて調べていますが、同様の検査をself軸を用いずに行うと、次のようになります。

<xsl:if test="local-name() = 'image' and namespace-uri() = 'http://www.w3.org/1999/xhtml'">
	<xsl:message terminate="yes">image要素型を検知</xsl:message>
</xsl:if>

主に述語内で使うことになりそうです。

これは、全blockquote要素の子要素の内、p要素でない要素を表現します。最後のステップにおいてコンテクストノードがp要素であるかどうかを、QNameを用いて調べています。

追記:属性は不可

self::QNameは、self::*のサブセットであると考えると分かり易いのですが、self軸の主ノード型は要素ノードです。従って、たとえカレントノードやコンテクストノードが属性ノードであったとしても、self::QNameで自分自身を示すことは出来ません。自分自身を表現するにはself::node()とするしかなく、QNameで属性型を検査することはできません。

追記:name()関数は使えない!?

name()関数を使うと、例えばname() = 'html:title' 等の式でそのノードの型をQNameにより判別できそうですが、これはソース文書(変換元のXML文書)においてある名前空間に関連付けられている名前空間接頭辞を知っている場合にのみ使えます。

妥当な二つのXML文書があったとします。ここで、一方はデフォルトの名前空間を用いており、もう一方は接頭辞fooを用いているとすれば、name()関数の戻り値は異なってしまいます。スキーマは名前空間接頭辞について規定できませんから、そのような特定の接頭辞に依存したスタイルシートはナンセンスだと思います。


webmaster@jintrick.net
公開: 2003年09月30日
カテゴリ: XPath ,XSLT