XmlResolver:XSLT编译器错误

时间:2011-06-21 07:56:56

标签: c# .net xml xslt transformation

我遇到了XmlResolver类的麻烦。我在xml数据类型列中的MS SQL数据库中保存了一些XSLT文件。我正在尝试编写一个XmlResolver类实现,它将从数据库而不是从文件加载文本。但是我收到了XSLT编译错误。 这是一个非常简单的例子(输入和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类:

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编译器错误)。从文件中读取转换时,解析器工作正常。但我不想从文件中读取它。 谢谢, 彼得

1 个答案:

答案 0 :(得分:2)

问题是它用来关联每个文件的base-uri(通过XmlReader.BaseUri)。幸运的是,修复很简单;在GetEntity

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

请注意,这意味着实体的逻辑名称(相对分辨率)现在为test.xslt。在您的情况下,这很好,但如果路径使用文件夹结构,您需要小心确保它们是正确的相对/根。