【问题标题】:How to Debug Extended Functions in XSLT Using Saxon?如何使用 Saxon 调试 XSLT 中的扩展函数?
【发布时间】:2012-11-19 09:16:25
【问题描述】:

我一直在阅读有关如何在 XSLT 和 Saxon 中使用扩展函数的编程博客,但似乎无法在 XSLT 中成功引用外部 Java 函数。每当我运行转换时,我都会收到以下错误:

Cannot find a matching 0-argument function named {come.acme.javaxslt.business.CarBusiness}getModel()
  at xsl:apply-templates (file:/C:/Users/Dave/workspace/acme-javaXSLT-demo/cars.xsl#18)
     processing /cars/car[1]/model[1]
  in built-in template rule
  at xsl:apply-templates (file:/C:/Users/Dave/workspace/acme-javaXSLT-demo/cars.xsl#10)
     processing /cars
EXCEPTION: net.sf.saxon.trans.XPathException: Cannot find a matching 0-argument function named {com.acme.javaxslt.business.CarBusiness}getModel()
; SystemID: file:/C:/Users/Dave/workspace/acme-javaXSLT-demo/cars.xsl; Line#: 30; Column#: -1
net.sf.saxon.trans.XPathException: Cannot find a matching 0-argument function named {com.acme.javaxslt.business.CarBusiness}getModel()
    at net.sf.saxon.expr.ErrorExpression.evaluateItem(ErrorExpression.java:58)
    at net.sf.saxon.expr.ErrorExpression.iterate(ErrorExpression.java:71)
    at net.sf.saxon.expr.Atomizer.iterate(Atomizer.java:180)
...

引用的 Java 类:

package com.acme.javaxslt.business;

public class CarBusiness {

    public static String getModel(){
        return "/";
    }
}

XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cars="com.acme.javaxslt.business.CarBusiness">

<xsl:template match="/">
  <html>
  <body>
  <h2>My Car Collection</h2>  
  <xsl:apply-templates/>  
  </body>
  </html>
</xsl:template>

<xsl:template match="car">
  <p>
    <xsl:apply-templates select="make"/>  
    <xsl:apply-templates select="model"/>
  </p>
</xsl:template>

<xsl:template match="make">
  Make: <span style="color:#ff0000">
  <xsl:value-of select="."/></span>
  <br />
</xsl:template>

<xsl:template match="model">
  Artist: <span style="color:#00ff00">
  <xsl:value-of select="cars:getModel()"/></span>
  <br />
</xsl:template>


</xsl:stylesheet>

在 Java 中使用撒克逊语:

TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer(new StreamSource(new File(xslID)));
transformer.transform(new StreamSource(new File(sourceID)), new StreamResult(new File("html/report.html")));

只要上面运行,就会出现错误。

即使我将自定义 Java 类替换为 XSLT 中的内置 Java 方法,我也会遇到相同的错误。所以很明显 XSLT 没有与 Java 挂钩。

推荐的方法是将 -TJ 添加到 JVM 选项中,或者使用 FeatureKeys.TRACE_EXTERNAL_FUNCTIONS 做一些事情,但是我在网上搜索了很多关于如何执行此操作的信息,以便我可以看到为什么我的 XSLT 没有连接外部 Java 函数,但无济于事。

拜托,谁能帮我弄清楚我的问题是什么?

这发生在 Saxon PE 和 HE 上,我还没有尝试过其他版本。

谢谢!

【问题讨论】:

    标签: java xslt xslt-1.0 saxon


    【解决方案1】:

    我应该使用早期版本的 Saxon,Saxon-B 9.1.0.8,正如这里所指出的:

    http://sourceforge.net/p/saxon/discussion/94027/thread/33492ab5/

    只要我把旧的 jar 文件放在路径中,上面的 XSLT 就会正确调用 java 函数。

    【讨论】:

    • 很高兴您找到了解决方案。它也应该适用于 Saxon-PE。如果您需要有关撒克逊特定问题的帮助,请在 saxonica.plan.io 上提问 - 我们是否在 StackOverflow 上发现了问题,这很偶然。
    • 啊,是的,谢谢迈克尔,我的项目有两个版本,我自己也很困惑。它确实适用于 Saxon-PE。
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多