2012-12-06 51 views
1

XslCompiledTransform類有問題。 如果我試圖運行此代碼:XslCompiledTransform不能用字符串創建的XmlTestReader進行轉換

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." 

InnerException.Message:

"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。由於安全原因,我不會創建temporaty xslt解密文件。

+0

在哪行中得到異常?是pathToInputFile相對路徑? –

+1

請向我們展示確切的細節,例如完整的異常消息,引發異常的聲明,堆棧跟蹤並告訴我們樣式表代碼是否嘗試解析相對URL(樣式表代碼是否使用'document'函數?)。 –

回答

0

我認爲這是由於你手動設置內存流的位置爲0;你混淆了XmlTextReader。

我嘗試了上面的內容,當我評論該行時,它對我很好。

是否有一個特定的原因,你將它設置爲0?

+0

我對該行和我有同樣的例外: {「加載文檔時發生錯誤'',請參閱InnerException以獲取錯誤的完整說明。」} 內部異常: 「此操作不適用於相對URI「。 – andrzejt

+0

好的,那麼我們需要更多的信息,Martin Honnen建議。 – Marcus

1

我認爲我們需要看到XSLT和任何對document函數的調用。一般來說,您需要知道the document function具有第二個參數,該參數可用作基本URI來解析由第一個參數產生的URI。如果沒有第二個參數被傳入,如<xsl:value-of select="document('foo.xml')"/>樣式表代碼本身提供了基本的URI。如果從字符串加載樣式表代碼,那麼該機制可能無法解析URI,這與從文件系統或HTTP URI加載的樣式表發生的方式相同。該問題的解決方案取決於您要加載的資源的位置以及與主輸入文件相關的方式。如果要從主輸入文檔的相同位置加載,則應該使用document('foo.xml', /)而不是document('foo.xml')

+0

我要求提供另一個xslt文件。沒有使用文件fucnction。現在它可以工作。感謝幫助 – andrzejt