Java扩展函数
Java扩展函数可以在XPath或XQuery表达式中使用,以调用Java构造器或Java方法(静态或实例)。
Java类中的字段被视为一个不带任何参数的方法。一个字段可以是静态字段或实例字段。有关如何调用字段的说明,请参见静态字段和实例字段部分。
本部分分为以下几个小节:
请注意以下几点:
•如果您使用的是Altova桌面产品,该产品将尝试通过读取以下内容(按照以下顺序)自动检测到Java虚拟机的路径:(i) Windows注册表,以及(ii) JAVA_HOME 环境变量。您还可以在应用程序的“选项”对话框中添加自定义路径;该条目将优先于自动检测到的任何其他Java VM路径。
•如果您是在Windows机器上运行Altova服务器产品,则会先从Windows注册表中读取Java虚拟机路径;如果不成功,则会使用JAVA_HOME环境变量。
•如果您是在Linux或macOS机器上运行Altova服务器产品,请确保已正确设置JAVA_HOME环境变量,并且Java虚拟机库(在Windows上为jvm.dll文件)可以在\bin\server或\bin\client目录下找到。
扩展函数的形式
XPath/XQuery表达式中的扩展函数必须具有以下形式:prefix:fname()。
•prefix:部分将扩展函数标识为一个Java函数。它通过将扩展函数与一个范围内的命名空间声明相关联,其URI必须以java:开头(有关示例,请参见下文)。命名空间声明应标识一个Java类,例如: xmlns:myns="java:java.lang.Math". 然而,它也可以简单地写作: xmlns:myns="java" (不带冒号),扩展函数的fname()部分标识Java类。
•fname()部分标识了正在被调用的Java方法,并提供了该方法的参数(参见下方示例)。然而,如果由prefix:部分标识的命名空间URI没有标识一个Java类(参见上文),则应在fname()部分标识该Java类,在该类之前用一个点与该类分开(参见下方第二个XSLT示例)。
提示: | 被调用的类必须是本机的classpath。 |
XSLT示例
下面的两个示例展现了如何调用一个静态方法。在第一个示例中,类名称(java.lang.Math)已被包括在命名空间URI中,因此不得在fname()部分中。在第二个示例中,prefix:部分提供了前缀java:,而fname()部分标识了类以及方法。
<xsl:value-of xmlns:jMath="java:java.lang.Math"
select="jMath:cos(3.14)" />
<xsl:value-of xmlns:jmath="java"
select="jmath:java.lang.Math.cos(3.14)" />
扩展函数中的方法 (上方示例中的cos())必须与Java类中公共静态方法的名称(上方示例的java.lang.Math)相匹配。
XQuery示例
下面的XQuery示例与上面的XSLT示例类似:
<cosine xmlns:jMath="java:java.lang.Math">
{jMath:cos(3.14)}
</cosine>
用户定义的Java类
如果您已创建您自己的Java类,则在调用这些类中的方法时会有所不同,这取决于:(i) 这些类是通过JAR文件,还是通过类文件访问,以及(ii) 这些文件(JAR或类)是否位于当前目录(XSLT或XQuery文档所在的目录)。有关如何定位这些文件的说明,请参见用户定义的类文件和用户定义的Jar文件。请注意,不在当前目录中的类文件和所有JAR文件的路径必须被指定。