我遇到了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编译器错误)。从文件中读取转换时,解析器工作正常。但我不想从文件中读取它。 谢谢, 彼得
答案 0 :(得分:2)
问题是它用来关联每个文件的base-uri(通过XmlReader.BaseUri)。幸运的是,修复很简单;在GetEntity
:
XmlReader xmlread = XmlReader.Create(read, null, fileName);
请注意,这意味着实体的逻辑名称(相对分辨率)现在为test.xslt
。在您的情况下,这很好,但如果路径使用文件夹结构,您需要小心确保它们是正确的相对/根。