11

我目前正在从事一个涉及大量 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功能时得到的。首先我可以在单步执行参数后看到样式表代码(在模板匹配上),我得到了这个:

进入样式表时出现的错误

如果有人知道为什么它不起作用或有其他方法让它起作用,我将非常感激:)。

谢谢,
亚历克斯

4

2 回答 2

2

我不确定扩展对象的使用,但据我了解,您的问题是在 VS2010 中调试代码中的 XSLT 转换。这是我们用来调试 XSLT 转换的函数:

 public string ApplyTransformation(string inputFilePath, string xsltFileContent)
    {
        XslCompiledTransform transform = new XslCompiledTransform(debugEnabled);

        File.WriteAllText(xsltTempFilePath,xsltFileContent);
        transform.Load(xsltTempFilePath, XsltSettings.TrustedXslt, new XmlUrlResolver());

        XmlReader reader = XmlReader.Create(inputFilePath);
        StringWriter output = new StringWriter();
        XmlWriter writer =  XmlWriter.Create(output,transform.OutputSettings);
        transform.Transform(reader,writer);
        return output.ToString();
    }

不幸的是,VS2010 XSLT 调试器存在一个错误,它会使您的调试体验比 VS2008 更差。

于 2010-05-25T14:55:14.530 回答
0

考虑使用 XML Spy XSLT 调试器进行调试。它一直对我有用。

于 2010-06-28T20:07:57.217 回答