Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当Saxon XSLT转换失败时,如何检索错误详细信息?_C#_.net_Xml_Xslt_Saxon - Fatal编程技术网

C# 当Saxon XSLT转换失败时,如何检索错误详细信息?

C# 当Saxon XSLT转换失败时,如何检索错误详细信息?,c#,.net,xml,xslt,saxon,C#,.net,Xml,Xslt,Saxon,我正在为.NET使用Saxon9HE9.7.0.7。通常,在运行XsltTransformer.run时,将填充DomDestination.XmlDocument属性。但是,对于某些文档,该属性将为null。当属性为null时,我假设遇到了某种错误,但是没有抛出异常,并且在控制台上没有看到任何错误。如何检索有关转换失败原因的详细信息 对于一个这样的示例文档,我尝试了从命令行进行转换,并且没有任何问题 下面是一些示例代码。最后一行的destination.XmlDocument属性有时为空

我正在为.NET使用Saxon9HE9.7.0.7。通常,在运行XsltTransformer.run时,将填充DomDestination.XmlDocument属性。但是,对于某些文档,该属性将为null。当属性为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文档输出到一个文件。结果,XmlDocument属性为null,没有引发任何错误


根据,在执行transformer.Run时,错误通常应作为DynamicError异常抛出。

有两种错误:静态错误和动态错误

静态错误(例如,语法错误或使用未声明的变量或函数)添加到
XsltCompiler
ErrorList
属性中。
Compile()
方法将抛出异常,然后您应该检查错误列表中的详细信息以获取详细诊断信息


动态错误(例如除以零)导致
XsltTransformer.Run()
方法引发类
Saxon.Api.DynamicError
的异常

您能否发布最小但完整的XML和XSLT示例来演示这个问题?命令行上的输出是什么,格式良好的文档还是片段?具有默认构造函数的DomDestination只能存储格式良好的文档,而不是片段,因此有一种猜测是XSLT创建了一个包含多个顶级元素或根本没有根元素的片段。这并没有像我问的那样直接回答我的问题,但结果表明样式表是使用xsl:result-document输出到一个文件中的,这就是我获取null XmlDocument属性的方式。如果有人想解释transformer.Run通常如何报告错误,我会将其标记为已接受。