2017-10-03 7 views
0

申し訳ありませんが、私はここで間違いを犯しているとは思えません。 XMLを返すラクダルートがあり、出力をテストできるようにするために、SpringRunnerで動作するJUnitテストを作成しました。そこでは、XSDに対して検証するエクスチェンジからXMLストリームを取得します。出力XMLが有効ではないため、XSDが例外をスローするため、これは有効ですが、次のxqueryがEMPTY NAMESPACEで要素を生成する理由を理解できません。 XQueryのスニペット(私は再び、私はより多くのコードを提供することはできませんごめんなさい)を参照してください:xquery変換は要素に空の名前空間を作成します

declare default element namespace "http://www.dppgroup.com/XXXPMS"; 
let $cmmdoc := $doc/*:cmmdoc 
, $partner := $doc/*:cmmdoc/*:information/*:partner_gruppe/*:partner 
, $sequence:= fn:substring($cmmdoc/@unifier,3) 
return <ClientMMS xmlns:infra="http://www.dppgroup.com/InfraNS"> 
{ 
    for $x in $partner 
    where $x[@partnerStatusCode = " "] 
    return 
    element {"DataGroup" } { 
      <Client sequenceNumber="{$sequence}" /> 
    } 
} 

を私の問題は、このコードで結果のXMLには、次の名前空間の定義を持つデータグループ要素が含まれていることを、次のとおりです。

<?xml version="1.0" encoding="UTF-8"?> 
<ClientMMS xmlns="http://www.dppgroup.com/XXXPMS" 
      xmlns:infra="http://www.dppgroup.com/InfraNS"> 
    <DataGroup xmlns=""> 
     <Client sequenceNumber="170908065609671475"/> 
    </DataGroup> 
</ClientMMS> 

単体テストからスニペットを:私はなぜ番目の理由を見つけることができていないのXQuery導入/チュートリアル/説明でjdk1.8_102

String xml = TestDataReader.readXML("/input/info/info_in.xml", PROJECT_ENCODING); 
    quelle.sendBody(xml); 

    boolean valid = false; 
    try { 
     DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 

     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) archiv.getExchanges().get(1).getIn().getBody()); 
     Document document = documentBuilder.parse(byteArrayInputStream); 

     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     StreamResult result = new StreamResult(new StringWriter()); 
     DOMSource source = new DOMSource(document); 

     transformer.transform(source, result); 
     String xmlString = result.getWriter().toString(); 
     System.out.println(xmlString); 

を使用しています起こる。 あなたは、DataGroup要素がデフォルトの名前空間にない理由を説明できますか?

+0

最小限の自己完結型の実行可能なサンプルにXQueryを縮小し、SaxonまたはAltovaで実行すると、結果にネームスペースの 'xmlns =" "'という宣言はありません。どのXQuery実装を使用していますか?私はあなたのJavaコードがどのように関連しているのかもよく分かりませんが、一般的には名前空間を意識しないで、デフォルトの代わりに名前空間を認識する文書ビルダを使用するようにします。そのため、ファクトリを作成する前に 'setNamespaceAware(true) DocumentBuilder。 –

+0

こんにちは、ロック! #setNamespaceAware(true)が見つかりませんでした。そのため、javacodeも追加しました。なぜなら、Oxygen XML Developerでは、問題は発生しませんでしたが、私がJavaコードを使用したときだけでした。しかし違いがないかどうか分からなかったので、私はそれを言及しなかった:-)。もしあなたが私にあなたにアップホートを与えたいと思って、あなたのコメントを解決策にしたいなら、答えを作ってください。どうもありがとう! –

答えて

1

投稿したXQueryは、表示する名前空間の宣言を行わずに結果を整える必要があります。 Javaコードで

あなたが名前空間とXMLで作業したい場合は、デフォルトのDocumentBuilderFactoryが名前空間を認識されていないとして、あなたが名前空間を認識してDocumentBuilderを使用してくださいあなたはそれではDocumentBuilderを作成する前に、工場にsetNamespaceAware(true)を設定してください。

関連する問題