1

I have an XML document deserialized (an object contains the data). Now I am using an XSLT transformation file to create a new XML document.

transform(myXmlSourceObject, XSLT, output);

The variable output is now a Stream, XmlWriter or a String. It contains the new xml structure defined by the XSLT.

But I want to replace output with my desired target xml object, which i have already created/deserialized from the schema of the target xml. That means that I already have an objects that will be the target of the transformation. No new Stream, XmlWriter or String.

TargetXml alreadyCreatedTargetXmlObject = new TargetXml();
transform(myXmlSourceObject, XSLT, alreadyCreatedTargetXmlObject);

The point is that I want to fill the alreadyCreatedTargetXmlObject with values from myXmlSourceObject but also be able to do edit fields like the following

alreadyCreatedTargetXmlObject.name ="SomeNewName";
alreadyCreatedTargetXmlObject.location.x="50.78";

The new xml would be filled with data, and I want to edit values if I need to.

4

2 回答 2

1

您必须自己实现此功能 - 至少在使用标准的内置 .NET XSLT API 时是这样。

由于您想要实现的不是复杂的练习(假设转换始终为您提供相同的根元素,并且您使用的是支持合并的反序列化器, 那么它更多的是错误处理而不是实际代码),我不得不假设这里的一个问题是性能。直观地说,如果您希望将 XSLT 作为您的语言进行转换,那么解决性能问题的唯一方法就是构建扩展——这在 .NET 上也是一项简单的任务——但这会降低 XSLT 的可移植性。

更新(以解决您的评论):

(我不确定我理解为什么要在转换之前创建目标对象。)

您可以尝试这样做:设置对XslTransform.Transform的调用以将您的转换为 Stream(正如我所说,您实现了自己的“幻觉” - 您希望 API 看起来的方式)。使用 protobuf 的 Serializer.Merge 从上面的流中传入一个 XmlReader,以及您预先存在的对象来合并两者(出于什么原因,不清楚)。预先存在的对象的类型应该是使用 xsd.exe 生成的——我想。

根据您提供的伪代码,您可以在没有合并步骤的情况下逃脱。只需从传递给 Transform 的流中返回您反序列化的对象(使用 xsd.exe 基于目标 XML XSD 生成),然后设置您想要的任何属性 - 同样的事情。

于 2013-03-13T18:36:23.157 回答
0

我可能错了,但我不确定您是否可以使用 XSLT 做到这一点。最简单的方法可能是在转换后反序列化 xslt 的输出,或者直接在 Java 中编写转换以便能够访问您的对象。

于 2013-03-13T18:33:34.267 回答