orange/note

AJAXSLTを使ってみた

2009年7月6日作成

AJAXSLTは、 全部JavaScriptで書かれたXSLTライブラリです。 JavaScriptからXSLTプロセッサを呼べないSafariやOperaにも 対応しているとあったので、使ってみたのですが。。。

XMLの名前空間をよく理解していないのもあるので、 そう感じただけなのかもしれませんが、 AJAXSLTの動作に理不尽なものを感じたのでもう使わないです。 たぶん、根本的な原因はIEにあるのでしょうけど。

以下やってみたこと。淡々といきます。

文字列からxmlParseを使ってデータを作る場合

データはAtomを使うことにするので、 名前空間とルートノードは次のようになる。

atom = '<feed xmlns="http://www.w3.org/2005/Atom">' +
	'</feed>'

次に、XSLTの中で、Atom名前空間をatomとする。

xslt = '<xsl:stylesheet version="1.0"' +
	'	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"'
	'	xmlns:atom="http://www.w3.org/2005/Atom"'

この条件で、Atomのfeed要素にマッチさせるには、 IEやFirefoxのXSLTプロセッサでは以下のように書く。

<xsl:template match="atom:feed">

ここの名前空間は省略できない。XSLTで使うXPathは、 名前空間を省略した場合にはデフォルトではなく、 名前空間無しとして扱われるため。

AJAXSLTでは、上記の書き方ではマッチしない。 次の書き方になる。

<xsl:template match="feed">

外部ファイルから読み込む場合

上記のデータをそのまま使い、atom.xmlを作成する。 サーバから返すcontent-typeはapplication/xml。

<feed xmlns="http://www.w3.org/2005/Atom">
</feed>

次にindex.xslt。これもapplication/xml。 もちろんmatchで使うXPathには、名前空間を書いてはいけない。

<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:atom="http://www.w3.org/2005/Atom"

これらのデータを、jQuery.getを使って読み込み、 xsltProcessに渡すと、Safari4では期待通り動作するが、 IE8ではxsltProcessの結果が空文字列となり、うまくいかない。 jQuery.getの第4引数を使うと、読み込むフォーマットを 文字列やXML、JSON等から選べるので、 取得形式を文字列(text)に変更。 その文字列からxmlParse、xsltProcessを使っても結果は変わらず。 特にエラーが出ているわけでもないので原因不明。