运行 XSLT 和 SAXON (9.1.8) 中的自定义 Java 函数

Running custom Java functions within XSLT and SAXON (9.1.8)

我得到了一个 java class 文件和一些 xsl 转换的简单示例。我的目标是 运行 我的自定义 java 函数来自 XSLT 进程中的 class 文件(通过 SAXON)。 这怎么可能? 当我启动下面描述的批处理文件时,cmd 显示一条错误消息,提示我该函数不为 saxon 所知。所以我必须将我的 class 添加到 Java / 或 Saxon CLASSPATH?

转换应复制所有 XML 数据并 (return &) 显示图像文件的尺寸。

我的 XSL 转换

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ImageInfo="java:ImageInfo"
version="2.0">

<xsl:output method="xml"/>
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
<xsl:template/>

<xsl:template match="img">
    <xsl:copy>
        [image] file found: <xsl:value-of select="ImageInfo:getImageWidth(@src)"/> x <xsl:value-of select="ImageInfo:getImageHeight(@src)"/>
    </xsl:copy>
</xsl:template>

Java Class

import javax.swing.ImageIcon;
public class ImageInfo {

String filename;
ImageIcon img;

public ImageInfo(String filename) {
    this.filename = filename;
    img = new ImageIcon(filename);
}

public int getWidth() {
    return img.getIconWidth();
}

public int getHeight() {
    return img.getIconHeight();
}
}

Saxon 命令行调用(通过 .BAT)

java -jar "%~dp0\saxonb9-1-0-8j\saxon9.jar" -s:"data.xml" -xsl:"transformation.xsl" -o:"result.xml"

您需要 java 命令的 -cp 选项,例如java -cp ".;%~dp0\saxonb9-1-0-8j\saxon9.jar" net.sf.saxon.Transform -s:"data.xml" -xsl:"transformation.xsl" -o:"result.xml" 你需要确保 ImageInfo 所在的目录在 class 路径上,我添加了 .,假设 class 在你的路径中当前工作目录。

但是,请注意 ImageInfo:getImageWidth(@src) 会尝试调用静态方法 getImageWidth,您有实例方法,您拥有的方法称为 getWidth 并且它不接受参数.

请参阅旧版本 Saxon 9 的文档,它应该在 http://saxon.sourceforge.net/ 上可用。

一旦您按照 Martin 的建议解决了类路径问题,您想要的代码将如下所示:

<xsl:variable name="image" select="ImageInfo:new(@src)"/>
[image] file found: 
   <xsl:value-of select="ImageInfo:getWidth($image)"/> x 
   <xsl:value-of select="ImageInfo:getHeight($image)"/>