在Visual Studio 2010中使用扩展对象调试XSLT

Ale*_*ian 11 c# xslt debugging visual-studio extension-objects

我目前正在开发一个涉及大量XSLT转换的项目,我真的需要一个调试器(我有1000多行的XSLT ,我没有写它们:-).

该项目是用C#编写的,并使用扩展对象:

xslArg.AddExtensionObject("urn:<obj>", new <Obj>());
Run Code Online (Sandbox Code Playgroud)

据我所知,在这种情况下,Visual Studio是唯一可以帮助我逐步调试转换的工具.由于扩展对象,静态调试器没有用处(当它到达引用其命名空间的元素时会抛出错误).幸运的是,我发现这个线程给了我一个起点(至少我知道它可以完成).

在搜索MSDN之后,我找到了可以进入转换的标准.它们列在这里.简而言之:

  • 必须通过具有IXmlLineInfo接口(XmlReader&co.)的类加载XML和XSLT
  • XSLTCompiledTransform构造函数中使用的XML解析器是基于文件的(XmlUriResolver应该可以工作).
  • 样式表应该在本地机器上或内部网上(?)

据我所知,我符合所有这些标准,但它仍然无效.相关代码示例发布如下:

// [...]

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);
Run Code Online (Sandbox Code Playgroud)

我真的不明白我做错了什么.我检查了两个XmlReader对象上的接口,然后实现了所需的接口.此外,BaseUriXmlResolver继承自XmlUriResolver,样式表存储在本地.下面的截图是我在进入该Transform功能时获得的.首先,我可以在单步参数(模板匹配)后看到样式表代码,我得到:

我走进样式表时遇到的错误http://img339.imageshack.us/img339/4153/scrxslterror.jpg

如果有人知道为什么它不起作用或有另一种方式让它工作,我会非常有责任:).

谢谢,
亚历克斯

mfi*_*nov 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();
    }
Run Code Online (Sandbox Code Playgroud)

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