2

XslCompiledTransform クラスに問題があります。このコードを実行しようとした場合:

string pathToXsltFile, pathToInputFile, pathToOutputFile;
XsltSettings xsltSettings = new XsltSettings(true, true);
XslCompiledTransform myXslTransform = new XslCompiledTransform();
XmlTextReader reader = new XmlTextReader(pathToFile);
myXslTransform.Load(reader, xsltSettings, new XmlUrlResolver());
myXslTransform.Transform(pathToInputFile, pathToOutputFile);

それは正常に動作します。しかし、文字列 (テキスト) から XmlTextReader を作成したい場合:

MemoryStream mStrm = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(text));
XmlTextReader xmlReader = new XmlTextReader(mStrm);
mStrm.Position = 0;

そして実行してみてください:

myXslTransform.Load(xmlReader, xsltSettings, new XmlUrlResolver());
myXslTransform.Transform(pathToInputFile, pathToOutputFile);

私は例外を取得します:

"this operation is not supported for a relative uri"

いくつかの理由で、一時ファイルを作成したくなく、このファイルへのパスから XmlTextReader を作成します。

編集

完全な例外メッセージ:

"An error occurred while loading document ''.
See InnerException for a complete description of the error."

内部例外.メッセージ:

"This operation is not supported for a relative URI."

スタックトレース:

at System.Xml.Xsl.Runtime.XmlQueryContext.GetDataSource(String uriRelative, String uriBase)
at <xsl:template match=\"gmgml:FeatureCollection\">(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator {urn:schemas-microsoft-com:xslt-debug}current)
at <xsl:apply-templates>(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime, XPathNavigator )
at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at Execute(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlSequenceWriter results)
at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver dataSources, XsltArgumentList argumentList, XmlWriter writer, Boolean closeWriter)
at System.Xml.Xsl.XmlILCommand.Execute(XmlReader contextDocument, XmlResolver dataSources, XsltArgumentList argumentList, Stream results)
at System.Xml.Xsl.XslCompiledTransform.Transform(String inputUri, String resultsFile)
at MyNamespace.ApplyXslTransformation1(String input, String output, String xsltFileName)

例外の原因となったステートメント:

myXslTransform.Transform(pathToInputFile, pathToOutputFile);

ドキュメント機能については、明日聞かなければなりません。他の人からxsltファイルを入手しました。

xslt ファイルへのパスから XmlTextReader ファイルを作成したら、すべて問題ありませんでした。私も使用しようとしました:

myXslTransform.Load(pathToXsltFile, xsltSettings, new XmlUrlResolver());
myXslTransform.Transform(pathToInputFile, pathToOutputFile);

そしてそれも大丈夫でした。

これで、暗号化された xslt を取得できます。私はそれを復号化し、復号化された文字列から XmlTextReader を作成したいと考えています。セキュリティ上の理由から、一時的な xslt 復号化ファイルを作成するつもりはありません。

4

3 に答える 3

2

documentXSLT とそれが行う関数の呼び出しを確認する必要があると思います。一般に、document関数には、最初の引数から生じる URI を解決するためのベース URI として機能する 2 番目の引数があることに注意する必要があります。たとえば<xsl:value-of select="document('foo.xml')"/>、スタイルシート コード自体がベース URI を提供します。文字列からスタイルシート コードをロードすると、ファイル システムまたは HTTP URI からロードされたスタイルシートの場合と同じように、そのメカニズムによって URI が解決されない場合があります。この問題の解決策は、ロードするリソースの場所と、それがメインの入力ファイルにどのように関連しているかによって異なります。foo.xmlメインの入力ドキュメントと同じ場所からロードする場合は、document('foo.xml', /)代わりに実行するdocument('foo.xml')必要があります。

于 2012-12-06T17:00:05.330 に答える
0

これは、メモリストリームの位置を手動で0に設定したことが原因だと思います。XmlTextReaderを混乱させています。

私は上記を試しましたが、その行をコメントするとうまくいきます。

0に設定する特別な理由はありますか?

于 2012-12-06T14:21:08.613 に答える