- - PR -
XSLTからJavaのメソッドを呼ぶためには
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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) ------------------------------------------------------------------------------- |
|
投稿日時: 2008-07-07 14:52
http://www.kit.hi-ho.ne.jp/~ginga/xalan-j/extensions.html
のサンプルは動きますか? そちらの環境で |
|
投稿日時: 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"と記述するところまでは調べられたのですが、それから先が手詰まりになってしまいました。 |
|
投稿日時: 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-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) |
|
投稿日時: 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-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-19 12:39
あれからずーっとトライしているのですが、どうしても分かりません・・・。
誰か分かる方いないでしょうか??お願いします。 |