2009-03-06 8 views
2

XSLTとJXPathでjavabeansを変換することは可能ですか?

私はバニラのjavabeanを持っていると仮定します:

class Person { 
    String firstName; 
    String lastName; 
    ... 
} 

これを別のjavabeanに変換したいとしましょう:

class Human { 
    String name; 
    ... 
} 

私は現在、JXPathを使用して、

JXPathContext personContext = JXPathContext.newContext(person); 
JXPathContext humanContext = JXPathContext.newContext(new Human()); 
humanContext.setValue("name", personContext.getValue("firstName") + 
           personContext.getValue("lastName")); 

手でこのようなことを行うのではなく、これらの変換を指定するためにXSLTとJXPathを使用する方法がありますか?

答えて

0

確かに可能ですが、少し畳み込まれているようです。 1つは、あなたが言及する2つのクラスの間に継承関係があるように見えます。もしそうなら、他の型を引数として受け入れるコンストラクタを用意するべきでしょう。

明らかな継承関係がない場合は、javabeansセッターを使用するだけではどうですか?ここではJXPathを使う必要は何ですか?それはほとんど確実に遅くなります。

+0

にあります。2つのBeanが別々のモジュールから来ており、関係が非常に複雑な場合、XSLTを使用して宣言的に関係を表現すると効果的です。質問に示されているような簡単な例では、実際に巻き込まれたように見えます。 – VoidPointer

1

これは、XPathの実装であり、XSLTの実装ではないので、JXPathだけでは不可能だと思います。 XSLTはXPathを言語の一部として使用しますが、それ以上のものです。

豆をXMLにシリアル化し、XMLをXSLTで変換し、結果のXMLをターゲットクラスにデシリアライズすることができます。

<human> 
    <name>John Doe</name> 
</human> 
:したがって、あなたの人物オブジェクトのために、あなたはあなたがよりこれは、このような結果文書を生成する必要があり、このような本

<xslt:template match="/person"> 
    <human> 
     <name><xslt:value-of select="./firstName"/> <xslt:value-of select="./lastName"/></name> 
    </human> 
</xslt:template> 

としてテンプレートにXSLTを使用することができます

<person> 
    <firstName>John</firstName> 
    <lastName>Doe</lastName> 
</person> 

を得る可能性があります

このドキュメントは、Humanクラスのインスタンスにデシリアライズすることができます。

注:この例のために、BeanのXML表現は構成されています。実際には、java.beans.XMLEncoderを使用するか、そこにある他のJava/XMLバインディング実装(JAXBなど)を探すことができます。

+0

これは、2つの異なるアプリケーション間でデータを転送するためにXMLが使用されることに、より近いものになります。 +1 –

1

ドーザーBeanマッパー(http:// dozer。 sourceforge.net/)は類似しているbeanをマッピングするのに便利です。これはデフォルトで同じ名前の偽名をマッピングしますが、xmlを使用して別のマッピングに対して簡単にカスタマイズすることができます。このマッピングの例はhttp://dozer.sourceforge.net/documentation/mappings.html

関連する問題