从.net中的Saxon 9.x获取详细的错误描述

时间:2011-07-21 07:25:13

标签: .net xslt xslt-2.0 saxon

我有一个用saxon 9.x设置的xslt2转换引擎。我有一些带有大型xsl转换文件的大型xml文件。我可以使用XQSharp XSLT2引擎进行转换,但是使用saxon我会收到错误:

  

javax.xml.transform.TransformerConfigurationException:无法编译样式表。检测到1个错误。

我想从撒克逊人那里得到一些更详细的错误信息,例如错误的亚麻和原因。我能找到的唯一两个例外是:

  1. Saxon.Api.DynamicError
  2. Saxon.Api.StaticError
  3. 但他们并没有被扔掉。如何获得详细的错误描述?

    我有以下代码:

    <WebMethod()> _
    Public Function XSLTSaxon(ByVal inputXml As String, ByVal inputXsl As String) As String
            Dim response As String = ""
    
            Try
                ' Create a Processor instance.
                Dim processor As New Processor()
    
                ' Create xml reader based on xml string
                Dim xmlReader As XmlReader = xmlReader.Create(New StringReader(inputXml))
    
                ' Load the source document.
                Dim input As XdmNode = processor.NewDocumentBuilder().Build(xmlReader)
    
                ' Create a transformer for the stylesheet.
                Dim transformer As XsltTransformer = processor.NewXsltCompiler.Compile(New StringReader(inputXsl)).Load()
                ' Set the root node of the source document to be the initial context node.
                transformer.InitialContextNode = input
    
                ' Create a serializer.
                Dim serializer As New Serializer()
    
                Dim result As Stream = New MemoryStream()
                serializer.SetOutputStream(result)
    
                transformer.Run(serializer)
                result.Position = 0
                Using reader As StreamReader = New StreamReader(result)
                    response = reader.ReadToEnd()
                End Using
            Catch ex As Saxon.Api.DynamicError
                response = String.Format("<error>dynamicerror</error>", ex.ToString)
            Catch ex As Saxon.Api.StaticError
                response = String.Format("<error>staticerror</error>", ex.ToString)
            Catch ex As Exception
                response = String.Format("<error>{0}</error>", ex.ToString)
            End Try
    
            Return response
    End Function
    

1 个答案:

答案 0 :(得分:2)

默认情况下,编译错误消息将写入标准错误输出流。如果你不是从命令行控制台运行,那么最终在.NET上的东西是一个谜 - 我认为它会被某些日志文件隐藏在系统的某个地方,但它可能是可配置的。处理应用程序错误的最灵活方法是使用XsltCompiler的ErrorList属性 - 如果将此属性设置为空列表,Saxon会将错误信息作为StaticError对象添加到列表末尾。应用程序可以检索它并在最合适的地方显示它。

请注意,如果您访问Saxon的SourceForge页面,您会发现有一个论坛和Saxon问题的邮件列表。发布到这两个位置的问题总能得到答案。 StackOverflow是一个很棒的地方,但无论你的问题是否引起注意,它都会让人大吃一惊。