是否可以使用XSLT和JXPath转换javabeans?

时间:2009-03-06 09:38:10

标签: java xslt jxpath

假设我有一个香草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来指定这些转换?

3 个答案:

答案 0 :(得分:1)

我认为仅使用JXPath是不可能的,因为这是XPath实现而不是XSLT实现。 XSLT使用XPath作为语言的一部分,但它不止于此。

您可以尝试将bean序列化为XML,使用XSLT转换XML并将生成的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等等)

答案 1 :(得分:1)

Dozer bean mapper(http://dozer.sourceforge.net/)对于映射相似的bean非常有用。它默认使用相同的名称映射属性,但可以通过xml轻松地为不同的映射进行自定义。可以在http://dozer.sourceforge.net/documentation/mappings.html

找到此映射的示例

答案 2 :(得分:0)

我确信这是可能的,但似乎有点令人费解。首先,看起来你提到的两个类之间存在继承关系。如果是这样,你应该有一个构造函数接受另一个类型作为参数。

如果没有明显的继承关系,为什么不直接使用javabeans setter?这里有什么需要使用JXPath?这几乎肯定会慢一些。