背景:別のXSLT 2.0変換を実行するには、Webブラウザー内でXSLT 2.0を使用する必要があります。これは、XSLTプロセッサーのテストドライバーで使用されます。プロセッサ用のJavaScriptAPIを使用すると、変換を実行するための実行関数にパラメータとして渡されるリテラルコマンドオブジェクトを作成できます。
コマンドオブジェクトの構築はJavaScriptから非常に簡単ですが、XSLTからは、ユーザー定義のJavaScript関数を備えた組み込みのJavaScript拡張機能を使用して、XSLTデータをJavaScriptオブジェクトに変換する必要があります。XPath 2.0がアイテムのシーケンスで機能するという問題がありますが、シーケンスのシーケンスは許可されていません。私が現在使用しているアプローチは、変数cmdを宣言する次のXSLTスニペットに示されています。
参考までに、同等のJavaScriptを以下に示します。
var cmd= {
initialTemplate: initialTemplate,
stylesheet: stylesheet,
source: 'uk-maps.xml',
parameters: {
country: 'UK',
city: 'Cheltenham',
color: [28, 329, 767]
}
};
JavaScriptにクロスするとき、XSLTプロセッサはシーケンスをJavaScriptオブジェクトの配列に変換します。ユーザー定義のJavaScript関数js:objectは配列を処理し、奇数アイテムのプロパティを作成し、対応する偶数アイテムからプロパティ値を割り当てます。js:object関数を再帰的に呼び出して、JavaScriptオブジェクトを新しいオブジェクトのプロパティに割り当てることができます。私の他の回避策は、ユーザー定義のjs:array関数です。これは、XPathシーケンスをJavaScriptオブジェクトにラップして、シーケンスアイテムとして埋め込むことができるようにします。js:object関数は、これらのjs:arrayオブジェクトを検出してアンラップする必要があります。
したがって、問題は次のとおりです。これは、XSLT 2.0内からJavaScriptリテラルオブジェクトを構築する1つの方法ですが、すべての人に適さない可能性のあるいくつかの回避策が含まれます。他にどのような方法を使用できますか?おそらく、XMLをリテラルJavaScriptオブジェクトに変換する既存のJavaScriptライブラリ関数を使用する必要がありますか?XSLT 3.0マップ(このプロセッサではまだ利用できません)は、より良いソリューションを提供しますか?提案されたJSON/XSLT互換性機能についてどのような進歩がありましたか?js:objectとjs:arrayがプロセッサに組み込まれた拡張関数であるとしたら、もっと良いでしょうか?