2

私は現在、帯域幅を節約するために、XML+XSLTをサポートするクライアントにXML+XSLTを送信しているWebサイトで作業しています。ただし、クライアントがサポートしていない場合は、サーバー側で変換を実行し、結果のHTMLを送信します。

私のXSLTでは、次のようなXPathを使用したいと思います。

document('')//xsl:variable[@name='test']

(ノードセットを返すため)。これはFirefoxとIEの両方でうまく機能しますが、XsltCompiledTransformでは機能しません。

この操作は、相対URIではサポートされていません。

XmlUrlResolverでエラーが発生しているようです。カスタムのものを渡すことができることはわかっていますが、それを超えると、どこを見ればよいのかよくわかりません。この式をどのように機能させるかについて、誰かが私にヒントを教えてもらえますか?必要に応じて、いくつかのMSXSL拡張機能を使用できてうれしいです。結局のところ、コードはサーバー側でしか表示されません。

より一般的な注意点として、この種のXPathクエリを実行するのは一般的ですか?私は気づいていない巨大なXSLTトラップに陥っていますか?遅いWebブラウザが停止するようなクレイジーなことをするのでしょうか?

4

3 に答える 3

1

XsltSettingsの適切に構築されたインスタンスを使用して変換を開始し、ドキュメント機能が許可されるようにします。

次に例を示します。

// Create the XsltSettings object with the document fn allowed.
XsltSettings settings = new XsltSettings(true,false);

// Create the XslCompiledTransform object and load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load("sort.xsl", settings, new XmlUrlResolver());

あなたの他の質問

より一般的な注意点として、この種のXPathクエリを実行するのは一般的ですか?私は気づいていない巨大なXSLTトラップに陥っていますか?遅いWebブラウザが停止するようなクレイジーなことをするのでしょうか?

唯一の落とし穴は、これによりXSLTスタイルシートが再解析される可能性があることです。これは、比較的遅い操作です。

さらに懸念されるのは、//パフォーマンスの問題を引き起こすことはほぼ確実である略語の使用です。

このトリックはグローバル変数にのみ使用してから、次の式を使用することをお勧めします。

document('')/*/xsl:variable[@name='test']

最後に、XSLT 1.0プロセッサ間の移植性が失われる心配がない場合は、xxx:node-set()実装に依存する拡張関数を使用して、変数のRTFを通常のノードセットに変換する方が効率的です。ここでexslt:node-set()は、XSLTプロセッサがEXSLTを実装している場合に使用できます。XslCompiledTransformを含む多くのXSLTプロセッサがサポートしているため、これでも比較的大きな移植性が実現されますexslt:node-set()

于 2010-12-10T06:21:06.140 に答える
1

document('')を使用できるソリューションを見つけることができませんでしたが、使用しているのはノードセットに評価する変数を取得することだけなので、処理する前にXMLを調整していますサーバー側で、変更するには:

document('')//xsl:variable[@name='test']

に:

msxsl:node-set($test)

正確に最も優雅な解決策ではありませんが、それは私の目的のために機能します。

于 2010-12-10T14:26:39.713 に答える
0

使ってみましたか

document('')//xsl:variable[@name='test']

document()つまり、引数を渡さない代わりに、の引数として長さゼロの文字列を使用します。仕様によると、document()少なくとも1つの引数が必要です。FirefoxとIEがそれについて怠惰であることに私は驚いています。しかし、それはXsltCompiledTransformが不幸である理由を説明することができます。

一方、XsltCompiledTransformがそこで相対URIをサポートしない場合は、機能し''ない可能性があります(相対URIと見なされます)。変換をコンパイルしているため、スタイルシートのツリー表現へのアクセスを提供するのは不便である可能性があります。「XSLTプロセッサは特定のURIスキームをサポートする必要はありません。XSLTプロセッサのドキュメントでは、XSLTプロセッサがサポートするURIスキームを指定する必要があります。」

于 2010-12-10T05:37:11.580 に答える