Saxon/C 当 XSLT 包含或使用 "xsl::result-document" 时,HE 11.2 打印空输出

Saxon/C HE 11.2 prints empty output when XSLT has an include or using "xsl::result-document"

当我将 xsl:include 更改为 xsl:import 时,它以某种方式起作用并且 return 不是一个空文件。我正在使用 Xslt30Processor class 和函数 Xslt30Processor::TransformFiletoFile(),即使 transform.c 也不起作用。当我的 xslt 有一个“xsl:result-document” 声明它也不起作用。

我什至尝试使用 Saxon/C 的早期版本(1.2.0 系列),但仍然没有用。是否有任何选项允许使用 xsl:include 或其他东西。

这适用于 Java 和 .NET,但不适用于 C API。 使用 JNI 时我没有收到任何错误或异常。 请帮忙。

这是一个演示问题的小例子:

source.xml:

<xml/>

main.xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text" encoding="utf-8" standalone="yes"/>
  <xsl:include href="referenced.xsl" />

  <xsl:template match="/">hello</xsl:template>
</xsl:stylesheet>

referenced.xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:f="my-functions.org"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                version="2.0">
  <xsl:function name="f:next-nr" as="xs:integer">
    <xsl:param name="node"/>
    <xsl:sequence select="xs:integer(replace($node, '\D', ''))"/>
  </xsl:function>
</xsl:stylesheet>

当 运行 Transform.exe 的 C 版本时,return 没有错误,也没有输出。我注意到在将这个测试用例放在一起时,如果我将 include 更改为导入这个示例并不重要。如果我使用 Saxon 10.6 工具文件夹中的 Transform.exe,则会按预期生成一个文件。但是,我找不到 Saxon 10.6 的任何 C/C++ 文件。

result-document 的问题是一个单独的问题,但结果相同。

我想我找到了样式表编译失败的一个原因,HE 找不到 categories.xml.

似乎是一个 build/configuration 问题

来自编译的堆栈跟踪:

Exception in thread "main" java.lang.ExceptionInInitializerError
        at net.sf.saxon.regex.RECompiler.escape(Unknown Source)
        at net.sf.saxon.regex.RECompiler.parseTerminal(Unknown Source)
        at net.sf.saxon.regex.RECompiler.piece(Unknown Source)
        at net.sf.saxon.regex.RECompiler.parseBranch(Unknown Source)
        at net.sf.saxon.regex.RECompiler.parseExpr(Unknown Source)
        at net.sf.saxon.regex.RECompiler.compile(Unknown Source)
        at net.sf.saxon.regex.ARegularExpression.<init>(Unknown Source)
        at net.sf.saxon.java.JavaPlatform.compileRegularExpression(Unknown Source)
        at net.sf.saxon.Configuration.compileRegularExpression(Unknown Source)
        at net.sf.saxon.functions.RegexFunction.tryToBindRegularExpression(Unknown Source)
        at net.sf.saxon.functions.RegexFunction.makeFunctionCall(Unknown Source)
        at net.sf.saxon.functions.Replace.makeFunctionCall(Unknown Source)
        at net.sf.saxon.functions.RegexFunctionSansFlags.makeFunctionCall(Unknown Source)
        at net.sf.saxon.functions.registry.BuiltInFunctionSet.bind(Unknown Source)
        at net.sf.saxon.functions.FunctionLibraryList.bind(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseFunctionCall(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseBasicStep(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseRelativePath(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parsePathExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseExprSingle(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseFunctionCall(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseBasicStep(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseRelativePath(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parsePathExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseExprSingle(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parseExpression(Unknown Source)
        at net.sf.saxon.expr.parser.XPathParser.parse(Unknown Source)
        at net.sf.saxon.expr.parser.ExpressionTool.make(Unknown Source)
        at net.sf.saxon.style.StyleElement.makeExpression(Unknown Source)
        at net.sf.saxon.style.XSLSequence.prepareAttributes(Unknown Source)
        at net.sf.saxon.style.StyleElement.<unknown>(Unknown Source)
        at net.sf.saxon.style.StyleElement.processAllAttributes(Unknown Source)
        at net.sf.saxon.style.StyleElement.processAllAttributes(Unknown Source)
        at net.sf.saxon.style.PrincipalStylesheetModule.processAllAttributes(Unknown Source)
        at net.sf.saxon.style.PrincipalStylesheetModule.preprocess(Unknown Source)
        at net.sf.saxon.style.Compilation.compilePackage(Unknown Source)
        at net.sf.saxon.style.StylesheetModule.loadStylesheet(Unknown Source)
        at net.sf.saxon.style.Compilation.compileSingletonPackage(Unknown Source)
        at net.sf.saxon.s9api.XsltCompiler.compile(Unknown Source)
        at net.sf.saxon.option.cpp.Xslt30Processor.getXslt30Transformer(Unknown Source)
        at net.sf.saxon.option.cpp.Xslt30Processor.transformToFile(Unknown Source)
Caused by: java.lang.RuntimeException: Unable to read categories.xml file
        at net.sf.saxon.regex.charclass.Categories.build(Unknown Source)
        at net.sf.saxon.regex.charclass.Categories.getCategory(Unknown Source)
        at net.sf.saxon.regex.charclass.Categories.<clinit>(Unknown Source)
        ... 47 more

所以导致编译失败的既不是xsl:include也不是xsl:result-document,似乎HE构建在尝试编译时没有或找不到它的categories.xml文件包含代码中的正则表达式。

作为一种解决方法,我认为 运行 SaxonC EE 11.2 可能无需许可证 (-license:off),因为它只是使用 HE 功能,而 EE 包不知何故正确构建以找到其 categories.xml,因此它不会在编译正则表达式时失败。

我已提出 https://saxonica.plan.io/issues/5372 关于 categories.xml 文件故障的问题。