2

バニラ 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 とともに使用してこれらの変換を指定する方法はありますか?

4

3 に答える 3

1

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

あなたが試みることができるのは、Bean を XML にシリアライズし、XML を XSLT で変換し、結果の XML をターゲット クラスにデシリアライズすることです。したがって、 person オブジェクトの場合、次のようになります。

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

このようなテンプレートで XSLT を使用することができます

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

これにより、次のような結果ドキュメントが生成されます。

<human>
    <name>John Doe</name>
</human>

このドキュメントは、Human クラスのインスタンスに逆シリアル化できます。

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

于 2009-03-06T09:53:51.010 に答える
1

Dozer Bean マッパー (http://dozer.sourceforge.net/) は、類似した Bean のマッピングに役立ちます。デフォルトでは同じ名前のプロパティをマップしますが、xml を使用して別のマッピング用に簡単にカスタマイズできます。このマッピングの例は、http://dozer.sourceforge.net/documentation/mappings.htmlにあります。

于 2011-03-30T22:02:23.247 に答える
0

可能だと確信していますが、少し複雑なようです。1つは、あなたが言及した2つのクラスの間に継承関係があるようです。もしそうなら、おそらく他の型を引数として受け入れるコンストラクターが必要です。

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

于 2009-03-06T09:48:24.550 に答える