Oxygen XML 中的 Saxon HE Java 扩展函数出现初始化错误

问题描述 投票:0回答:1

我正在尝试学习如何使用 Java 和 Saxon-HE 使用 ExtensionFunctionDefinition 类创建 XSLT 扩展函数。到目前为止,我已经能够使用 Oxygen DITA-OT 插件提取并重新编译 .jar,将 Latex 转换为 SVG。当我添加必要的 jar 文件作为扩展名并按预期转换输入字符串时,效果很好。

我觉得这个问题必须非常简单(诚然,我在编写 Java 语言方面非常缺乏经验)。

但是,当我对 Java 代码进行一些相当简单的修改以简单地将字符串连接在一起时,我得到了非常不起眼的错误:

E [Saxon-HE 11.4] TestPackage.TestClass.<init>()

这是我的Java:

package TestPackage;

import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.SequenceType;
import net.sf.saxon.value.StringValue;

class TestClass extends ExtensionFunctionDefinition {
    @Override
    public StructuredQName getFunctionQName() {
        return new StructuredQName("TestClass", "java:TestPackage.TestClass", "function");
    }
    
    @Override
    public SequenceType[] getArgumentTypes() {
        return new SequenceType[] { SequenceType.SINGLE_STRING };
    }
    
    @Override
    public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) {
        return SequenceType.VOID;
    }
    
    @Override
    public ExtensionFunctionCall makeCallExpression() {
        return new ExtensionFunctionCall() {
            @Override
            public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException {
                String str1 = "Hello ";
                String str2 = "!";
                String first = arguments[0].head().getStringValue();
                String result = str1.concat(first).concat(str2);
                return StringValue.makeStringValue(result);
            }
        };
    }
}

这是我的转换样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:saxon="http://saxon.sf.net/"
    xmlns:mine="java:TestPackage.TestClass">
    
    <xsl:template match="/doc">
        <xsl:message>Doc here!</xsl:message>
        <doc>
            <xsl:apply-templates/>
        </doc>
    </xsl:template>
    
    <xsl:template match="//name">
        <xsl:variable name="first-name" as="xs:string" select="@first"/>
        <xsl:variable name="last-name" as="xs:string" select="@last"/>
        <name>
            <xsl:copy-of select="mine:function($first-name)"/>
        </name>
    </xsl:template>
</xsl:stylesheet>

输入 XML 文件是一个非常简单的元素结构(正如您可以想象的),其中包含一些

<name first="example"/>
子元素。我希望每个元素都转换为 Hello example!,但我只是得到了上述错误。此外,似乎 Saxon-HE(或任何 Saxon 版本,这似乎并不重要)在任何转换之前读取 jar 文件时都会给出此错误。也就是说,消息“医生在这里!”在给出错误之前永远不会产生。

java xslt saxon oxygenxml
1个回答
0
投票

我的第一个想法是您根本无法向 Saxon 处理器注册

ExtensionFunctionDefinition
,例如通过调用
Processor.registerExtensionFunction()
。但我认为这会给你不同的诊断。

对于诊断此类问题,命令行上的 -TJ 选项可能会有所帮助。

我认为您在函数名称中使用 URI“java:TestPackage.TestClass”,这表明这是一个自反扩展函数,这让您感到困惑。我认为这不是主要问题,但它可能会导致诊断混乱。

此外,您已声明函数返回

SequenceType.VOID
,但您的样式表尝试使用结果,这将失败。应更改该函数以声明其实际结果类型,
SequenceType.SINGLE_STRING

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.