运行 XSLT 和 SAXON (9.1.8) 中的自定义 Java 函数
Running custom Java functions within XSLT and SAXON (9.1.8)
元
- Saxon XSLT 处理器(9.1.8 版)
- Java
- XSLT 2.0
我得到了一个 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)"/>
元
- Saxon XSLT 处理器(9.1.8 版)
- Java
- XSLT 2.0
我得到了一个 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)"/>