假设我有一个香草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)
我认为仅使用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?这几乎肯定会慢一些。