【问题标题】:Running custom Java functions within XSLT and SAXON (9.1.8)在 XSLT 和 SAXON (9.1.8) 中运行自定义 Java 函数
【发布时间】:2016-03-13 00:45:13
【问题描述】:

  • Saxon XSLT 处理器 (v. 9.1.8)
  • Java
  • XSLT 2.0

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

转换应该复制所有 XML 数据并(返回 &)显示图像文件的维度。

我的 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 类

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 扩展类以便 xsl 可以找到它们?

标签: java xml batch-file xslt saxon


【解决方案1】:

按照 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)"/>

【讨论】:

  • 非常感谢。是否需要创建一个新的 java 对象才能调用函数?
  • getWidth() 和 getHeight() 方法是在类的实例上定义的方法,所以是的,如果没有实例来应用它们,就无法调用它们。
  • 我明白了。所以我决定在返回类型方法本身中创建对象,并让它们从方法中获取输入参数。现在工作正常。再次感谢您的帮助!
【解决方案2】:

您需要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 所在的目录位于类路径上,我已添加 .,假设该类位于您当前的工作目录中。

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

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

【讨论】:

  • 扩展类路径并从撒克逊添加主类有所帮助。谢谢。
  • 请注意,类路径分隔符将取决于操作系统 - 在 Unix 上是 :
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多