有没有一种方法来调试从数据库中通过自定义XmlUrlResolver加载或有没有人知道XSLT文件,有什么下面的errormessage的是什么?
我有一个进口一个共同的XSLT文档XSLT样式表:
<xsl:import href="db://common.hist.org"/>
该计划由一个自定义处理XmlResolver
加载从DB的XSLT文件,但我得到一个错误:
具有相同键的条目已经存在。
常见的XSLT文件提到了xsl:import
包含一些常见的XSLT模板,每一个独特的名字。
这个错误已经开始从本地文件系统到移动的数据库XSLT文档后出现。 当使用指向本地文件的默认导入计划,并加载从本地文件系统的XSLT文档时,不会发生错误。
我也尝试创建的实例时打开调试XslCompiledTransform
,但不知何故,这是不可能的“步入”基于数据库的XSLT。
_xslHtmlOutput = new XslCompiledTransform(XSLT_DEBUG);
更新:下面是基本的解析代码的要求,但例外是不是我的代码内部发生; 因此,我想在下面这段代码没有明显的理由。 (此相同的代码实际上是用来加载包含进口,并注释掉进口一切正常时,XSLT样式表。)
public class XmlDBResolver : XmlUrlResolver
{
private IDictionary<string,string> GetUriComponents(String uri)
{
bool useXmlPre = false;
uri = uri.Replace("db://", "");
useXmlPre = uri.StartsWith("xml/");
uri = uri.Replace("xml/", "");
IDictionary<string, string> dict = new Dictionary<string, string>();
string app = null, area = null, subArea = null;
if (!String.IsNullOrWhiteSpace(uri))
{
string[] components = uri.Split('.');
if (components == null)
throw new Exception("Invalid Xslt URI");
switch (components.Count())
{
case 3:
app = components[0];
break;
case 4:
area = components[0];
app = components[1];
break;
case 5:
subArea = components[0];
area = components[1];
app = components[2];
break;
default:
throw new Exception("Invalid Xslt URI");
}
dict.Add("application", app);
dict.Add("area", area);
dict.Add("subArea", subArea);
dict.Add("xmlPreTransform", String.Format("{0}", useXmlPre));
}
return dict;
}
public override System.Net.ICredentials Credentials
{
set { /* TODO: check if we need credentials */ }
}
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
/*
* db://<app>.hist.org
* db://<area>.<app>.hist.org
* db://<subArea>.<area>.<app>.hist.org
*
* */
Tracing.TraceHelper.WriteLine(String.Format("GetEntity {0}", absoluteUri));
XmlReader reader = null;
switch (absoluteUri.Scheme)
{
case "db":
string origString = absoluteUri.OriginalString;
IDictionary<string, string> xsltDict = GetUriComponents(origString);
if(String.IsNullOrWhiteSpace(xsltDict["area"]))
{
reader = DatabaseServiceFactory.DatabaseService.GetApplicationXslt(xsltDict["application"]);
}
else if (!String.IsNullOrWhiteSpace(xsltDict["area"]) && String.IsNullOrWhiteSpace(xsltDict["subArea"]) && !Boolean.Parse(xsltDict["xmlPreTransform"]))
{
reader = DatabaseServiceFactory.DatabaseService.GetAreaXslt(xsltDict["application"], xsltDict["area"]);
}
else if (!String.IsNullOrWhiteSpace(xsltDict["area"]) && !String.IsNullOrWhiteSpace(xsltDict["subArea"]))
{
if(Boolean.Parse(xsltDict["xmlPreTransform"]))
reader = DatabaseServiceFactory.DatabaseService.GetSubareaXmlPreTransformXslt(xsltDict["application"], xsltDict["area"], xsltDict["subArea"]);
else
reader = DatabaseServiceFactory.DatabaseService.GetSubareaXslt(xsltDict["application"], xsltDict["area"], xsltDict["subArea"]);
}
return reader;
default:
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
}
和完整性IDatabaseService接口(相关部分):
public interface IDatabaseService
{
...
XmlReader GetApplicationXslt(String applicationName);
XmlReader GetAreaXslt(String applicationName, String areaName);
XmlReader GetSubareaXslt(String applicationName, String areaName, String subAreaName);
XmlReader GetSubareaXmlPreTransformXslt(String applicationName, String areaName, String subAreaName);
}
更新:我试图从Web服务器来代替,该工程暂时加载样式表来隔离问题。 我了解到,在SQL Server存储显然只XML片段没有XML声明,在对比的是样式表被存储在网络服务器。
更新:异常的堆栈跟踪:
System.Xml.Xsl.XslLoadException:XSLT-Kompilierungsfehler。 Fehler贝(9,1616)。 ---> System.ArgumentException:用相同键的条目已经存在..贝System.Collections.Specialized.ListDictionary.Add(对象键,对象的值)贝System.Collections.Specialized.HybridDictionary.Add(对象键,对象值)贝System.Xml.Xsl.Xslt.XsltLoader.LoadStylesheet(的XmlReader读取器,布尔包括)贝System.Xml.Xsl.Xslt.XsltLoader.LoadStylesheet(URI的URI,布尔包括)贝System.Xml.Xsl.Xslt.XsltLoader .LoadStylesheet(XmlReader中的读者,布尔包括)---恩德德inneren Ablaufverfolgung DES Ausnahmestacks ---贝System.Xml.Xsl.Xslt.XsltLoader.LoadStylesheet(XmlReader中的读者,布尔包括)北System.Xml.Xsl.Xslt.XsltLoader .Load(的XmlReader读取器)贝System.Xml.Xsl.Xslt.XsltLoader.Load(编译器的编译器,对象的样式表,的XmlResolver的XmlResolver)贝System.Xml.Xsl.Xslt.Compiler.Compile(对象的样式表,的XmlResolver的XmlResolver,QilExpression&QIL)贝System.Xml.Xsl.XslCompiledTransform.LoadInternal(对象样式,XsltSettings设置,XmlResolve [R stylesheetResolver)贝System.Xml.Xsl.XslCompiledTransform.Load(字符串stylesheetUri,XsltSettings设置的XmlResolver stylesheetResolver)北(我的命名空间和类).GetXslTransform(预转换布尔)北(我的命名空间和类).get_XslHtmlOutput()北(我命名空间和类).get_DisplayMarkup()