.NET 2.0/VS2005XSLを解決するには、文字列からXSLをロードする変換が含まれていますか?
私は、XSL変換を実行するためにXslCompiledTransform
クラスを使用しようとしています。私は「メインを読み込むことができれば、今
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="Included.xsl" />
...
...
</xsl:stylesheet>
:
Main.xsl:私は<xsl:include>
声明の形で他への参照を含む第1のどの2つのXSLファイルを、持っています.xsl」私の変換コードは、のように簡単になり、URIとしての地位をファイル:
// This is a function that works. For demo only.
private string Transform(string xslFileURI)
{
XslCompiledTransform xslt = new XslCompiledTransform();
// This load works just fine, if I provide the path to "Main.xsl".
// The xsl:include is automatically resolved.
xslTransform.Load(xslFileURI);
StringWriter sw = new StringWriter();
xslt.Transform(Server.MapPath("~/XML/input.xml"), null, sw);
return sw.ToString();
}
問題は、私のように文字列としてMain.xslファイルの内容を受信した文字列をロードする必要があるということですXmlReader/IXpathNavigable
。 これは現時点で必要な制限です。XmlReader/XpathDocument
を使って同じことをしようとすると、コードがC:\Program Files\Microsoft Visual Studio 8\Common7\IDE\
フォルダの "Included.xsl"を検索するため、失敗します。明らかに、XmlResolver
は入力XSLとして文字列を受け取るだけなので、相対URLを解決することはできません。この方向で
私の努力は次のようになります。
// This doesn't work! Halp!
private string Transform(string xslContents)
{
XslCompiledTransform xslt = new XslCompiledTransform();
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = CredentialCache.DefaultCredentials;
//METHOD 1: This method does not work.
XmlReaderSettings settings = new XmlReaderSettings();
settings.XmlResolver = resolver;
XmlReader xR = XmlReader.Create(new StringReader(xslContents), settings);
xslt.Load(xR); // fails
// METHOD 2: Does not work either.
XPathDocument xpDoc = new XPathDocument(new StringReader(xslContents));
xslt.Load(xpDoc, new XsltSettings(true, true), resolver); //fails.
StringWriter sw = new StringWriter();
xslt.Transform(Server.MapPath("~/XML/input.xml"), null, sw);
return sw.ToString();
}
私が含まれるXSLファイルを参照Stream
を得るために、XmlUrlResolverのResolveUri
メソッドを使用しようとしましたが、どのようにと混乱していていますこのストリームを使用するIOWは、どのように私はMain.xslたXmlReaderに加えて、このストリームを使用するようにXslCompiledTransform
オブジェクトを教えてください:
Uri mainURI = new Uri(Request.PhysicalApplicationPath + "Main.xsl");
Uri uri = resolver.ResolveUri(mainURI, "Included.xsl");
// I can verify that the Included.xsl file loads in the Stream below.
Stream s = resolver.GetEntity(uri, null, typeof(Stream)) as Stream;
// How do I use this Stream in the function above??
すべてのヘルプは大歓迎です。長い投稿を申し訳ありません!あなたの参考のために
、例外スタックトレースに次のようになります。
[FileNotFoundException: Could not find file 'C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\Included.xsl'.]
System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +328
System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) +1038
System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize) +113
System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials) +78
System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) +51
System.Xml.Xsl.Xslt.XsltLoader.CreateReader(Uri uri, XmlResolver xmlResolver) +22
System.Xml.Xsl.Xslt.XsltLoader.LoadStylesheet(Uri uri, Boolean include) +33
System.Xml.Xsl.Xslt.XsltLoader.LoadInclude() +349
System.Xml.Xsl.Xslt.XsltLoader.LoadRealStylesheet() +704
System.Xml.Xsl.Xslt.XsltLoader.LoadDocument() +293
System.Xml.Xsl.Xslt.XsltLoader.LoadStylesheet(XmlReader reader, Boolean include) +173
あなたの質問に似た何かが働いていて、MSDNの記事「Unknownの解決:.NET FrameworkでのカスタムXmlResolversの構築」(http://msdn.microsoft.com/en-us/)ライブラリ/ aa302284.aspx) - これは非常に有望な解決策を提供するようです。 –