1

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 と連携していないことは明らかです。

推奨されるアプローチは、JVM オプションに -TJ を追加するか、FeatureKeys.TRACE_EXTERNAL_FUNCTIONS を使用して何かを実行することですが、Web で高低を検索して、これを行う方法に関する詳細情報を見つけ、XSLT の理由を理解できるようにしました。外部Java関数と接続していないため、役に立ちません。

誰かが私の問題が何であるかを理解するのを手伝ってくれますか?

これは Saxon PE と HE で発生しています。他のバージョンはまだ試していません。

ありがとう!

4

1 に答える 1

0

ここで指摘されているように、以前のバージョンの Saxon、Saxon-B 9.1.0.8 を使用する必要がありました。

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

古いjarファイルをパスに入れるとすぐに、上記のXSLTはJava関数を正しく呼び出しました.

于 2012-11-19T11:33:39.990 に答える