我目前正在从事一个涉及大量 XSLT 转换的项目,我真的需要一个调试器(我有 1000 多行长的 XSLT,但我没有编写它们 :-)。
该项目是用 C# 编写的,并使用了扩展对象:
xslArg.AddExtensionObject("urn:<obj>", new <Obj>());
据我所知,在这种情况下,Visual Studio 是唯一可以帮助我逐步调试转换的工具。由于扩展对象,静态调试器没有用处(当它到达引用其命名空间的元素时会引发错误)。幸运的是,我找到了这个线程,它给了我一个起点(至少我知道可以做到)。
在搜索 MSDN 之后,我找到了可以进行转换的标准。它们在此处列出。简而言之:
- XML 和 XSLT 必须通过具有
IXmlLineInfo
接口 (XmlReader
& co.)的类加载 - 构造函数中使用的 XML 解析器
XSLTCompiledTransform
是基于文件的(XmlUriResolver
应该可以工作)。 - 样式表应该在本地机器或 Intranet 上(?)
据我所知,我符合所有这些标准,但它仍然不起作用。相关代码示例贴在下面:
// [...]
xslTransform = new XslCompiledTransform(true);
xslTransform.Load(XmlReader.Create(new StringReader(contents)), null, new BaseUriXmlResolver(xslLocalPath));
// [...]
// I already had the xml loaded in an xmlDocument
// so I have to convert to an XmlReader
XmlTextReader r = new XmlTextReader(new StringReader(xmlDoc.OuterXml));
XsltArgumentList xslArg = new XsltArgumentList();
xslArg.AddExtensionObject("urn:[...]", new [...]());
xslTransform.Transform(r, xslArg, context.Response.Output);
我真的不明白我做错了什么。我检查了两个XmlReader
对象的接口,它们实现了所需的接口。此外,BaseUriXmlResolver
继承自XmlUriResolver
并且样式表存储在本地。下面的屏幕截图是我进入该Transform
功能时得到的。首先我可以在单步执行参数后看到样式表代码(在模板匹配上),我得到了这个:
如果有人知道为什么它不起作用或有其他方法让它起作用,我将非常感激:)。
谢谢,
亚历克斯