1

XML ドキュメントをデシリアライズしました (オブジェクトにデータが含まれています)。現在、XSLT 変換ファイルを使用して新しい XML ドキュメントを作成しています。

transform(myXmlSourceObject, XSLT, output);

変数outputは、Stream、XmlWriter、または String になりました。XSLT によって定義された新しい xml 構造が含まれています。

outputしかし、ターゲットxmlのスキーマからすでに作成/逆シリアル化した、目的のターゲットxmlオブジェクトに置き換えたいです。つまり、変換の対象となるオブジェクトが既にあるということです。新しい Stream、XmlWriter、または String はありません。

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

alreadyCreatedTargetXmlObjectポイントは、からの値を入力したいmyXmlSourceObjectだけでなく、次のような編集フィールドを実行できるようにしたいということです

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

新しい xml にはデータが入力されるため、必要に応じて値を編集したいと考えています。

4

2 に答える 2

1

少なくとも標準の組み込み .NET XSLT API を使用している場合は、この機能を自分で実装する必要があります。

あなたが望むことは達成するための複雑な演習ではないので(変換が常に同じルート要素を与え、マージをサポートするデシリアライザーを使用し ていると仮定すると、実際のコードではなくエラー処理にもっとあると仮定します)、私は仮定しなければなりませんここでの懸念はパフォーマンスです。直観的に、変換する言語として XSLT が必要な場合、パフォーマンスを回避する唯一の方法は拡張機能を構築することです (これも .NET では簡単な作業です) が、それでは XSLT の移植性が低下します。

更新(コメントに対処するため):

(変換前にターゲット オブジェクトを作成する理由がよくわかりません。)

これを試すことができます: XslTransform.Transformへの呼び出しを設定して、Stream への変換を行います (前述のように、API の外観を「錯覚」として実装します)。上記のストリームから XmlReader を渡す protobuf の Serializer.Merge と、既存のオブジェクトを使用して 2 つをマージします (理由は不明です)。既存のオブジェクトの型は、xsd.exe を使用して生成されているはずです。

あなたが提供した疑似コードに基づいて、マージステップなしで逃げることができます. 逆シリアル化したオブジェクト (ターゲット XML XSD に基づいて xsd.exe を使用して生成) を Transform に渡されたストリームから返し、必要なプロパティを設定するだけです。同じことです。

于 2013-03-13T18:36:23.157 に答える
0

私は間違っているかもしれませんが、XSLT でそれができるかどうかはわかりません。最も簡単な方法は、変換後に xslt の出力を逆シリアル化するか、オブジェクトにアクセスできるように変換を Java で直接記述することです。

于 2013-03-13T18:33:34.267 に答える