Jintrick.netagenda2002年06月アーカイブ → 2002年06月23日

XSLT、XPath

template要素のmatch属性内のlocation path

decendant-or-self軸がNGになっているためdecendant-or-self::node()は駄目だが、同じ意味の省略形「//」なら通る。その他、parent軸もNGらしい。というか、child軸とattribute軸以外は全部駄目。だから「//」が通るのは例外的と考えるべきかも。

position関数(XPath)にがっかり

XPointerで遊んでいた時には、XPathの関数は全然知らなかったが、XSLTがらみになると重要になってくる。position関数は、コンテキストノードの「位置」を返す正しくは、カレントノードリスト内のカレントノードの位置です。本を鵜呑みにしてはいけませんな。 本当にそれだけの関数だ……。過剰な期待をした自分が悪いのだけど、親ノードの横の位置くらいは知りたい:

position(..)

もちろんこれは駄目。position関数に引数はない。

count関数

XSLTは、フラットな構造に厳しい。<xsl:template match="/"></xsl:template>内で(XPathの)count関数が使えないのには驚きだ。ルート要素直下に見出しをズラズラ並べていたのだけど、数えてくれない……。このためだけに階層を一つ増やしてみたのだけど、なんか気持ち悪い。 ルートノードとルート要素は違うものだったという罠。

XMLで内容を記述して、XSLTで構造を定義して、CSSで見栄えを……と思っていたけど、XSLTが弱い、というよりそもそも用途が違うっぽいので無理。要素を自由に切り貼りできるようなものではないらしい。ソースのXMLで構造を明示しないと駄目だ。要するに、XMLパーサを意識してXMLを書かねばならない。

追記

要素を自由に切り貼りできるようなものではないらしい。と書いてしまいましたが、あれは嘘でした。template要素のmode属性、call-template要素をよく知らなかったのが勘違いの原因。


webmaster@jintrick.net
公開: 2002年06月23日
カテゴリ: XPath ,XSLT