NET 2.0/VS2005Cách giải quyết XSL bao gồm trong một phép biến đổi tải XSL từ một chuỗi?
Tôi cố gắng để sử dụng lớp XslCompiledTransform
để thực hiện một chuyển đổi XSL. Tôi có hai tập tin XSL, là người đầu tiên trong số đó bao gồm một tham chiếu đến khác theo hình thức của một câu lệnh <xsl:include>
:
Main.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="Included.xsl" />
...
...
</xsl:stylesheet>
Bây giờ, Nếu tôi có thể nạp "Main .xsl" nộp chính nó như là một URI, mã chuyển đổi của tôi sẽ là đơn giản như:
// 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();
}
vấn đề là tôi nhận được nội dung của file Main.xsl như là một chuỗi và cần phải nạp chuỗi như một XmlReader/IXpathNavigable
. Đây là hạn chế cần thiết tại thời điểm này. Khi tôi cố gắng làm tương tự bằng cách sử dụng XmlReader/XpathDocument
, nó không thành công vì mã tìm kiếm "Included.xsl" trong thư mục C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\
! Rõ ràng, XmlResolver
không thể giải quyết URL tương đối vì URL này chỉ nhận được chuỗi là XSL đầu vào.
nỗ lực của tôi theo hướng này trông giống như:
// 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();
}
Tôi đã cố gắng sử dụng các phương pháp ResolveUri
của XmlUrlResolver để có được một Stream
tham khảo các tập tin XSL để được bao gồm, nhưng bối rối như thế nào để sử dụng Luồng này. IOW, làm thế nào để tôi nói với đối tượng XslCompiledTransform
sử dụng dòng này ngoài các Main.xsl XmlReader:
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??
Any help is appreciated rất nhiều. Xin lôi vi bai đăng dai!
Đối với các bạn tham khảo, các ngoại lệ StackTrace trông như thế này:
[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
Tôi đang làm việc trên một cái gì đó tương tự như những gì câu hỏi của bạn dường như yêu cầu và tôi tìm thấy một bài viết MSDN - [Giải quyết các Unknown: Xây dựng Custom XmlResolvers trong. NET Framework] (http://msdn.microsoft.com/en-us/ library/aa302284.aspx) - dường như cung cấp một giải pháp rất hứa hẹn. –