.NET 2.0/VS2005एक्सएसएल को कैसे हल करें एक ट्रांसफॉर्मेशन में शामिल है जो स्ट्रिंग से एक्सएसएल लोड करता है?
मैं एक XSL परिवर्तन प्रदर्शन करने के लिए XslCompiledTransform
वर्ग का उपयोग करने की कोशिश कर रहा हूँ।
Main.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="Included.xsl" />
...
...
</xsl:stylesheet>
अब, अगर मैं लोड कर सकता है "मुख्य मैं दो XSL फ़ाइलें, जिनमें से पहले एक <xsl:include>
बयान के रूप में अन्य के लिए एक संदर्भ भी शामिल है .xsl "यूआरआई के रूप में फाइल, मेरे परिवर्तन कोड के रूप में सरल होगा:
// 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\
फ़ोल्डर में "include.xsl" ढूंढता है! जाहिर है, XmlResolver
सापेक्ष यूआरएल को हल करने में सक्षम नहीं है क्योंकि यह केवल इनपुट एक्सएसएल के रूप में एक स्ट्रिंग प्राप्त करता है।
इस दिशा में मेरे प्रयासों देखो की तरह:
// 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, मैं कैसे XslCompiledTransform
वस्तु बताऊँ 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??
किसी भी मदद की बहुत सराहना कर रहा है। लंबी पोस्ट के लिए क्षमा करें!
[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
मैं आपके प्रश्न की आवश्यकता के समान कुछ पर काम कर रहा हूं और मुझे एक एमएसडीएन लेख मिला - [अज्ञात हल करना: .NET Framework में कस्टम XmlResolvers बनाना] (http://msdn.microsoft.com/en-us/ लाइब्रेरी/aa302284.aspx) - ऐसा लगता है कि यह एक बहुत ही आशाजनक समाधान प्रदान करता है। –