2012-01-25 5 views
0

Nodeオブジェクトの要素を並べ替えて、xsd:sequenceの順序に一致するような方法はありますか?私はNode.normalizeのドキュメントを読みましたが、その機能を実行していないようです。何か他にもできることはありますか?ノード要素がxsd:sequence orderと一致するようにノード要素を並べ替える方法は?

私はそれがXSLTで行うことができると信じているが、それはJavaでネイティブ何かを持つとは対照的に、操作を実行するためにXSLTを使用するために過度に複雑なソリューション、および特別java-xlstパーサのように聞こえるでしょう。

また、実際に私の処理を行うために複雑な関数をコード化する必要がありますか?あなたが操作することができ、あなたのクラスパス

にあなたはSaxonなどのXMLパーサを置く必要があります

import org.w3c.dom.*; 
import javax.xml.parsers.*; 
import javax.xml.transform.*; 

http://saxon.sourceforge.net/を参照してください):

+0

の可能な重複を。 [xsd:sequence orderと一致するように順序付けられていないxmlを変換できますか?](http://stackoverflow.com/questions/7771462/can-you-transform-unordered-xml-to-match-an-xsdsequence-order) – kojiro

答えて

2

私が正しくあなたの質問を読めば、あなたが欲しいのは、むしろに従って再配列のノードを取得する方法(単純のように)「魔法」でありますいくつかのXML APIを使用してノードを移動する方法とは対照的に、外部のXSDに送信します。

trueの場合、そのようなことを達成するための一般的な方法を提供するAPIは認識していません。また、XSDが記述できるコンテンツモデルの複雑さを考えると、プログラミングの些細な部分でもありません。

また、非常に単純な状況では、解決することは事実上不可能です。この非常に簡単な例を考えてみましょう:i)シーケンスa-b-c、ii)シーケンスb-c-aの2つの選択肢からなるコンテンツモデルを想像してみてください。 XMLコンテンツはc-b-aの順番で提供されます(要件に応じて、無効なXMLを取り込み、有効にします)。この例では、これは正しい方法ですか?

もちろん、これはあなたのシナリオではありません。私が知る限り、誰もこのような問題の解決策を思いついた理由を指摘しようとしているだけです。

シーケンスの下にあるコンテンツモデルがほんの些細なので、XMLが到着するシーケンスに関係なく、それを解決する明確な方法が可能である場合、またはXMLコンテンツが既知の方法で間違った方法で提供される場合、

-1

あなたは以下のパッケージを使用してJavaでXMLを直接操作することができますXMLを手作業で入力し、入力文書のビットを読み取り、必要な出力文書を作成するか、xsltスタイルシートを作成してJavaコードから文書を直接変換することができます。

出発点はここをお試しください:

http://oreilly.com/catalog/javaxslt/chapter/ch05.html

+1

Saxonいずれにしても、これは、オムレツを作る方法を知りたいと思う人に、彼がフライパンを必要とすることを伝えるようなものです。 –

2

あなたの場合....);しかし、私はそれだけでウサギの穴を下に起こっている、それがジェネリックにしようとしていない、ことをお勧め - 時間、あなたはXMLの操作にお好みのアプローチを使用して、それをコーディングする必要がスキーマが名前付きモデルグループや置換グループ、ワイルドカードのような複雑な機能をたくさん使用するように書かれていない限り、xs:sequenceだけが心配し、選択/繰り返しはできません。いずれにしてもXSLT 2.0やXQueryを使用し、Javaでコード化しようとするのを忘れた場合は、変数$ seqがxs:sequence要素の場合、$ Eという名前の要素のソートキーは "count($ x/xs:element [(@ name | @ref)= $ E]/preceding-sibling :: *」、あなただけのXSLにこの表現を差し込むことができるように:ソート

<xsl:for-each select="*"> 
    <xsl:sort select="count($seq/xs:element[(@name|@ref)=local-name(current())]/preceding-sibling::*"/> 
    ... 
</xsl:for-each> 

として、おそらく名前空間またはあなたが遭遇する可能性のある他のもののためにfinessingのビットが必要ですが、あなたのアイデアを得る

関連する問題