2011-06-21 23 views
3

XmlResolverクラスに問題があります。 MS SQLデータベースにxmlデータ型の列で保存されたいくつかのXSLTファイルがあります。私はファイルからではなく、データベースからテキストをロードする、XmlResolverクラスの実装を記述しようとしています。しかし、私はXSLTコンパイラのエラーを取得しています。 (XSLTXmlResolver:XSLTコンパイラエラー

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(); 
    } 
} 

実行がTransform.Load行に失敗します。ここで は非常に簡単な例(両方の入力のテキストと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のクラスですコンパイラエラー)。ファイルから変換を読むとき、リゾルバは正常に動作します。しかし、私はファイルからそれを読んではいけません。 ありがとう、 Petr

答えて

2

問題は、(XmlReader.BaseUriを使用して)各ファイルを関連付けるために使用するbase-uriです。修正は幸いにも簡単です。 GetEntityで:

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

注この(相対解像度用)エンティティの論理名は、現在test.xsltであることを意味しています。あなたの場合は問題ありませんが、パスがフォルダ構造を使用している場合は、それらが相対的/ルートにあることを確実にするために注意する必要があります。

+0

素晴らしい!それは完璧に動作します:-)多くのありがとう – Petr