当 Saxon XSLT 转换失败时如何检索错误详细信息?
How do I retrieve error details when Saxon XSLT transformation fails?
我正在为 .NET 使用 Saxon 9 HE 9.7.0.7。通常,当我 运行 XsltTransformer.Run 时,DomDestination.XmlDocument 属性 将被填充。但是,对于某些文档,属性 将为空。当 属性 为 null 时,我假设遇到了某种错误,但没有抛出异常,而且我在控制台上也没有看到任何错误。如何检索有关转换失败原因的详细信息?
对于一个这样的示例文档,我尝试从命令行进行转换,并且没有任何问题地完成了。
这是一些示例代码。最后一行的 destination.XmlDocument 属性 有时会为空。
// Compile stylesheet
var processor = new Processor();
var compiler = processor.NewXsltCompiler();
var executable = compiler.Compile(new Uri(xsltFilePath));
var declaredArgs = executable.GetGlobalParameters();
// Do transformation to a destination
var destination = new DomDestination();
using (var inputStream = new MemoryStream())
{
xml.Save(inputStream);
inputStream.Position = 0;
var transformer = executable.Load();
transformer.SetInputStream(inputStream, new Uri(inputXmlFileInfo.DirectoryName));
foreach (var arg in args)
{
var matchingArgDeclaration = declaredArgs.FirstOrDefault(a => a.Key.LocalName.ToLower() == arg.Key.ToLower());
if (matchingArgDeclaration.Key == null)
{
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(arg.Value));
}
else
{
// try to load up the specific parameter type
// list is based on http://www.saxonica.com/documentation/#!dotnetdoc/Saxon.Api/XdmAtomicValue
XdmItemType argType = matchingArgDeclaration.Value.getDeclaredItemType();
var argTypeName = "";
if (argType != null &&
argType is XdmAtomicType)
argTypeName = ((XdmAtomicType)argType).Name.LocalName;
switch (argTypeName.ToLower())
{
case "boolean":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToBoolean(arg.Value)));
break;
case "integer":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToInt32(arg.Value)));
break;
case "decimal":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToDecimal(arg.Value)));
break;
case "float":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToSingle(arg.Value)));
break;
case "double":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToDouble(arg.Value)));
break;
case "anyuri":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(new Uri(arg.Value)));
break;
case "qname":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(new QName(arg.Value)));
break;
default:
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(((arg.Value))));
break;
}
}
}
transformer.Run(destination);
}
// Save result to a file (or whatever else you wanna do)
destination.XmlDocument.Save(outputFileName);
事实证明,给我的样式表正在尝试使用 xsl:result-document 输出到文件。结果,XmlDocument 属性 为 null 且未引发任何错误。
根据 documentation,执行 transformer.Run 时,错误通常应作为 DynamicError 异常抛出。
有两种错误:静态错误和动态错误。
XsltCompiler
的 ErrorList
属性 添加了静态错误(例如,语法错误,或使用了未声明的变量或函数)。 Compile()
方法将抛出异常,然后您应该检查 ErrorList 中的详细信息以进行详细诊断。
动态错误(例如被零除)导致 XsltTransformer.Run()
方法抛出异常 class Saxon.Api.DynamicError
。
我正在为 .NET 使用 Saxon 9 HE 9.7.0.7。通常,当我 运行 XsltTransformer.Run 时,DomDestination.XmlDocument 属性 将被填充。但是,对于某些文档,属性 将为空。当 属性 为 null 时,我假设遇到了某种错误,但没有抛出异常,而且我在控制台上也没有看到任何错误。如何检索有关转换失败原因的详细信息?
对于一个这样的示例文档,我尝试从命令行进行转换,并且没有任何问题地完成了。
这是一些示例代码。最后一行的 destination.XmlDocument 属性 有时会为空。
// Compile stylesheet
var processor = new Processor();
var compiler = processor.NewXsltCompiler();
var executable = compiler.Compile(new Uri(xsltFilePath));
var declaredArgs = executable.GetGlobalParameters();
// Do transformation to a destination
var destination = new DomDestination();
using (var inputStream = new MemoryStream())
{
xml.Save(inputStream);
inputStream.Position = 0;
var transformer = executable.Load();
transformer.SetInputStream(inputStream, new Uri(inputXmlFileInfo.DirectoryName));
foreach (var arg in args)
{
var matchingArgDeclaration = declaredArgs.FirstOrDefault(a => a.Key.LocalName.ToLower() == arg.Key.ToLower());
if (matchingArgDeclaration.Key == null)
{
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(arg.Value));
}
else
{
// try to load up the specific parameter type
// list is based on http://www.saxonica.com/documentation/#!dotnetdoc/Saxon.Api/XdmAtomicValue
XdmItemType argType = matchingArgDeclaration.Value.getDeclaredItemType();
var argTypeName = "";
if (argType != null &&
argType is XdmAtomicType)
argTypeName = ((XdmAtomicType)argType).Name.LocalName;
switch (argTypeName.ToLower())
{
case "boolean":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToBoolean(arg.Value)));
break;
case "integer":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToInt32(arg.Value)));
break;
case "decimal":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToDecimal(arg.Value)));
break;
case "float":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToSingle(arg.Value)));
break;
case "double":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(Convert.ToDouble(arg.Value)));
break;
case "anyuri":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(new Uri(arg.Value)));
break;
case "qname":
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(new QName(arg.Value)));
break;
default:
transformer.SetParameter(new QName(arg.Key), new XdmAtomicValue(((arg.Value))));
break;
}
}
}
transformer.Run(destination);
}
// Save result to a file (or whatever else you wanna do)
destination.XmlDocument.Save(outputFileName);
事实证明,给我的样式表正在尝试使用 xsl:result-document 输出到文件。结果,XmlDocument 属性 为 null 且未引发任何错误。
根据 documentation,执行 transformer.Run 时,错误通常应作为 DynamicError 异常抛出。
有两种错误:静态错误和动态错误。
XsltCompiler
的 ErrorList
属性 添加了静态错误(例如,语法错误,或使用了未声明的变量或函数)。 Compile()
方法将抛出异常,然后您应该检查 ErrorList 中的详细信息以进行详细诊断。
动态错误(例如被零除)导致 XsltTransformer.Run()
方法抛出异常 class Saxon.Api.DynamicError
。