0

a.xml から b.xml に変換する xquery ファイルがあります。以下は私のxクエリの例です:

<TestMessage>
    <Header>
      <MessageType>
           {for $x in doc("input.xml")//Test/NewHeader return 
        if ($x/MessageType/text() = "FIRST") then "FirstMessageType"
        else "SecondMessageType"
    }   
      </MessageType>
    </Header>
 </TestMessage>

これは正常に機能し、MessageType が適切に設定されます。ただし、名前空間を属性として TestMessage 要素に追加する必要があります。だから、私がそうするとき、

<TestMessage xmlns="http://www.testsource.com/TestMessage">
    <Header>
      <MessageType>
           {for $x in doc("input.xml")//Test/NewHeader return 
        if ($x/MessageType/text() = "FIRST") then "FirstMessageType"
        else "SecondMessageType"
    }   
      </MessageType>
    </Header>
 </TestMessage>

xquery の結果には空の MessageType 要素があります。x-query ドキュメントに名前空間を追加する以外は何も変更していません。しかし、これが間違った結果のxmlを与える理由がわかりません。

どんな助けでも大歓迎です。

どうもありがとう!

4

1 に答える 1

1

デフォルトの名前空間を要素に追加するとTestMessage、その名前空間は、その下で実行している XPath にも適用されdoc("input.xml")//Test/NewHeaderます($x/MessageType/text()

そのコンテンツに名前空間がない場合、最も簡単な方法は、XML ルートで名前空間プレフィックスを宣言し、xmlns:test="http://www.testsource.com/TestMessageすべての要素にプレフィックスを付けることです:<test:TestMessage xmlns:test="http://www.testsource.com/TestMessage>など<test:Header>です。

これを回避する 1 つの方法は、名前空間のない XQuery コードをデフォルトの名前空間の XML の外で実行することです。

declare function local:get-message-type()
{
  for $x in doc("input.xml")//Test/NewHeader 
  return 
    if ($x/MessageType/text() = "FIRST") 
    then "FirstMessageType"
    else "SecondMessageType"
};

<TestMessage xmlns="http://www.testsource.com/TestMessage">
    <Header>
      <MessageType>
           { local:get-message-type() }   
      </MessageType>
    </Header>
</TestMessage>
于 2013-03-12T15:06:54.817 に答える