@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

XSLTからJavaのメソッドを呼ぶためには

投稿者投稿内容
みー
会議室デビュー日: 2008/07/05
投稿数: 11
投稿日時: 2008-07-06 23:12
はじめまして。XSLTからJavaのメソッドを使いたいと試行錯誤しています。
すいませんが分かる方いらしたら教えてください。


やりたいこと
-------------------------------------------------------------------------------
schoolクラスのsetNameメソッドを使って、XSL文書のtestにsaitamaという値をセットしたい。ですが、setNameメソッドの引数をどう設定したら良いかが分かりません。

<xsl:if test="java:setName ($school,@name)"/>
XSL文書のこの箇所です。
-------------------------------------------------------------------------------

XSL文書
-------------------------------------------------------------------------------
<?xml version="1.0"encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:java="http://xml.apache.org/xslt/java/test">

<xsl:output method="xml" encoding="UTF-8"/>

<xsl:variable name="school" select="school"/>

<xsl:template match="school">

<xsl:if test="@name">
<xsl:if test="java:setName ($school,@name)"/>

</xsl:stylesheet>
-------------------------------------------------------------------------------

処理対象のXML文書
-------------------------------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS" ?>

<school name="saitama">
</school>
-------------------------------------------------------------------------------

schoolクラス
-------------------------------------------------------------------------------
public class school
{
public String setName(){
return name;
/*引数の設定が分からない*/
}
}
-------------------------------------------------------------------------------

Xalanからのコマンド入力
-------------------------------------------------------------------------------
>java -Djava.endorsed.dirs=C:\xalan-j_2_5_1\bin org.apache.xalan.xslt.Process -IN school1.xml -XSL school2.xsl -OUT test.xml


classpathはschoo1.xmlとschool2.xslがあるフォルダには通しています。

-------------------------------------------------------------------------------

エラー内容
-------------------------------------------------------------------------------
XSLTエラー(javax.xml.transform.TransformerException):
java:lang.NoSuchMethodException:For extension function,
could not find method school.setName([ExpressionContent,]#NODESET,#NODESET)
-------------------------------------------------------------------------------
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2008-07-07 14:52
http://www.kit.hi-ho.ne.jp/~ginga/xalan-j/extensions.html
のサンプルは動きますか? そちらの環境で
みー
会議室デビュー日: 2008/07/05
投稿数: 11
投稿日時: 2008-07-07 22:01
返答ありがとうございます。「例: JavaとJavaScriptを使って、同じエクステンションを実装する」にある、MyCounter.javaを試したところ動きませんでした。

1つフォルダを作り、以下のものをおきました。
MyCounterクラス
Mycounter.xml
MycounterStyle.xsl

そして以下のコマンドを打ちました。
java -Djava.endorsed.dirs=C:\xalan-j_2_5_1\bin org.apache.xalan.xslt.Process -IN Mycounter.xml -XSL MycounterStyle.xsl -OUT t.xml

エラーは以下の通りでした。
Mycounter.xml;行#1;桁#7;XSLTエラー(javax.xml.tranform.TransformerException):The processing instruction target maching"[xX][mM][lL]" is not allowed.

XMLをHTMLに変換するなどはできましたが、設定が他に必要なのでしょうか。
名前空間のところにxmlns:java="http://xml.apache.org/xslt/java/test"と記述するところまでは調べられたのですが、それから先が手詰まりになってしまいました。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2008-07-08 11:01
Xalan-Java 2.5.1 was released on June 3, 2003
何年前のですか
xmlns:java="http://xml.apache.org/xslt/java/test" の test とか クラスPath の設定とか
みー
会議室デビュー日: 2008/07/05
投稿数: 11
投稿日時: 2008-07-08 16:01
エラーの原因が分かりました。用意したMycounter.xmlの1行目の先頭に空欄が入っていました。空欄を取ったら以下の出力を得ました。

<HTML xmlns:lxslt="http://xml.apache.org/xslt">
<H1>Names in alphabetical order</H1>
<p>[1]. Bertoni, David</p>
<p>[2]. Boag, Scott</p>
<p>[3]. Curcuru, Shane</p>
<p>[4]. Dick, Paul</p>
<p>[5]. Donohue, Jack</p>
<p>[6]. Farmer, Emily</p>
<p>[7]. Leslie, Donald</p>
<p>[8]. Marston, David</p>
<p>[9]. Midy, Myriam</p>
<p>[10]. Weir, Robert</p>
</HTML>

ちなみに、Xalan-Java 2.5.1でもうまくいきました。
ですが、エラー内容は相変わらずでてきます。

XSLTエラー(javax.xml.transform.TransformerException):
java:lang.NoSuchMethodException:For extension function,
could not find method org.apache.xml.utils.NodeVector.setName[ExpressionContent,]#NODESET)
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2008-07-09 16:20
ネームスペースを宣言する → Java フォーマット らしい

個別のインスタンスのインスタンス メソッドを呼び出すには:
prefix:methodName (object, args)
ここで、prefix はエクステンションのネームスペース プレフィックスで、
methodName は object について args を引数にして呼び出されるメソッドの名前だ。

てなわけで、$school インスタンスは org.apache.xml.utils.NodeVector 型であり
その setName メソッドを呼び出そうとするが、ございませぬ。というメッセージでは
could not find method school.setName([ExpressionContent,]#NODESET,#NODESET)
みー
会議室デビュー日: 2008/07/05
投稿数: 11
投稿日時: 2008-07-13 14:30
すいません。どうしてもメソッドを認識してもらえません。
school.Javaのコンパイルは通りますが、エラー内容は以前と変わりませんでした。
自分では、setNemaメソッドのところで、$school インスタンスをorg.apache.xml.utils.NodeVector 型にしているつもりなのですが・・・。



school1.xml
-----------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" ?>

<school name="saitama">
</school>
-----------------------------------------------------------------------------

school2.xsl
-----------------------------------------------------------------------------
<?xml version="1.0"
encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:java="http://xml.apache.org/xalan/java/school">

<xsl:output method="xml" encoding="UTF-8"/>


<xsl:variable name="school" select="a"/>


<xsl:template match="school">

<xsl:if test="@name">
<xsl:if test="java:setName($school,@name)"/>
</xsl:if>

</xsl:template>
</xsl:stylesheet>
-----------------------------------------------------------------------------

school.java
-----------------------------------------------------------------------------
// school.java
import org.apache.xml.utils.NodeVector;

public class school
{
public NodeVector setName(org.apache.xml.utils.NodeVector school,org.apache.xml.utils.NodeVector name)
{
return name;
}

}
-----------------------------------------------------------------------------

コマンド
-----------------------------------------------------------------------------
school.javaのコンパイルを通した上で以下のコマンドを打ちました。
java -Djava.endorsed.dirs=C:\\xalan-j_2_5_1\\bin org.apache.xalan.xslt.Process -IN school1.xml -XSL school2.xsl -OUT school3.xml
-----------------------------------------------------------------------------

エラー内容
-----------------------------------------------------------------------------
XSLTエラー(javax.xml.transform.TransformerException):
java:lang.NoSuchMethodException:For extension function,
could not find method school.setName[ExpressionContent,]#NODESET)
Check both static and instance methods.
-----------------------------------------------------------------------------
みー
会議室デビュー日: 2008/07/05
投稿数: 11
投稿日時: 2008-07-19 12:39
あれからずーっとトライしているのですが、どうしても分かりません・・・。
誰か分かる方いないでしょうか??お願いします。

スキルアップ/キャリアアップ(JOB@IT)