我正在尝试学习如何使用 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 文件时都会给出此错误。也就是说,消息“医生在这里!”在给出错误之前永远不会产生。
我的第一个想法是您根本无法向 Saxon 处理器注册
ExtensionFunctionDefinition
,例如通过调用 Processor.registerExtensionFunction()
。但我认为这会给你不同的诊断。
对于诊断此类问题,命令行上的 -TJ 选项可能会有所帮助。
我认为您在函数名称中使用 URI“java:TestPackage.TestClass”,这表明这是一个自反扩展函数,这让您感到困惑。我认为这不是主要问题,但它可能会导致诊断混乱。
此外,您已声明函数返回
SequenceType.VOID
,但您的样式表尝试使用结果,这将失败。应更改该函数以声明其实际结果类型,SequenceType.SINGLE_STRING
。