2011-06-21 113 views
3

我有XmlResolver類的麻煩。我在xml數據類型列中保存了MS SQL數據庫中的一些XSLT文件。我正在嘗試編寫一個XmlResolver類實現,它將從數據庫中而不是文件中加載文本。但是我得到了XSLT編譯器錯誤。 這是非常簡單的例子(包括輸入的文本和XSLT在這裏硬編碼):XmlResolver:XSLT編譯器錯誤

static void Main(string[] args) 
    { 
     string xslt = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""  xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" exclude-result-prefixes=""msxsl"" > 
<xsl:import href=""test.xslt"" /> 
<xsl:output method=""xml"" indent=""yes""/> 
<xsl:template match=""*""> 
    <xsl:value-of select=""$MyVariable""/> 
</xsl:template> 
</xsl:stylesheet>"; 
     XDocument transformationInput = XDocument.Parse("<test />"); 
     myResolv res = new myResolv(); 
     XslCompiledTransform transform = new XslCompiledTransform(true); 
     XsltSettings sett = new XsltSettings(true, true); 
     StringReader transr = new StringReader(xslt); 
     XmlReader tranReader = XmlReader.Create(transr); 
     transform.Load(tranReader, sett, res); 
    } 
} 

這裏是很簡單的XmlResolver類:上Transform.Load排

class myResolv : XmlResolver 
{ 
    public override Uri ResolveUri(Uri baseUri, string relativeUri) 
    { 
     return base.ResolveUri(baseUri, relativeUri); 
    } 

    public override System.Net.ICredentials Credentials 
    { 
     set { throw new NotImplementedException(); } 
    } 

    public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) 
    { 
     string fileName = System.IO.Path.GetFileName(absoluteUri.ToString()); 
     if (fileName == "test.xslt") 
     { 
      string newXslt = @"<?xml version=""1.0"" encoding=""utf-8""?> 
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""  xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" exclude-result-prefixes=""msxsl"" > 
<xsl:variable name=""MyVariable"" select=""1"" /> 
    </xsl:stylesheet>"; 
      StringReader read = new StringReader(newXslt); 
      XmlReader xmlread = XmlReader.Create(read); 
      return xmlread; 
     } 
     else 
      throw new NotImplementedException(); 
    } 
} 

執行失敗(XSLT編譯器錯誤)。當從文件讀取轉換時,解析器工作正常。但我不想從文件中讀取它。 謝謝, Petr

回答

2

問題是它使用關聯每個文件(通過XmlReader.BaseUri)的基uri。幸運的是,修復很簡單;在GetEntity

XmlReader xmlread = XmlReader.Create(read, null, fileName); 

注意,這意味着實體(相對分辨率)的邏輯名稱現在是test.xslt。在你的情況下,這很好,但如果路徑使用文件夾結構,你需要小心以確保它們相對/根目錄是正確的。

+0

太棒了!它工作完美:-)非常感謝 – Petr