2017-05-29 6 views
1

2つのXML文書をマップするためにXQueryを使用します。ソース文書には名前空間宣言が含まれていませんが、ターゲット文書にはターゲット名前空間が必要です(処理するシステムに応じてデフォルトの名前空間でなければなりません)。 XQueryは常に名前空間を必要とすることを理解しています(XQuery内のすべては名前空間にあります)。しかし、私はXQueryのXPath式を簡素化したいと思っており、特に可能な限り名前空間を省略したいと考えています。XQuery:名前空間を含まないソース文書の名前空間を省略します。

次の例では、状況を示しています

ソース文書

<?xml version="1.0" encoding="UTF-8"?> 
<!-- note that this documents does not declare any namespace --> 
<a> 
    <b> 
     <c>ABC</c> 
    </b> 
</a> 

XQueryファイル

xquery version "1.0"; 

declare variable $doc := .; 

let $abc := $doc/a/b/c 
return 
<foo xmlns="http://www.example.org">  
    <bar1>{$doc/a/b/c/text()}</bar1>  
    <bar2>{$doc/*:a/*:b/*:c/text()}</bar2> 
    <bar3>{$abc/text()}</bar3>  
</foo> 

これが発生し、次の(サクソン-HE 9.5.1.3):

<?xml version="1.0" encoding="UTF-8"?> 
<foo xmlns="http://www.example.org"> 
    <bar1/> 
    <bar2>ABC</bar2> 
    <bar3>ABC</bar3> 
</foo> 

基本的には、最初のルール(bar1)のように要素を構築できたいと思います。 e。 XPath式で名前空間を使用することなく残念ながら、それは動作していないようです。代わりに、第2のルール(bar2)のようにもっと面倒な構文を使用しなければなりません。これは として良いアイデアがあれば

回避策(だけでなく、むしろハックは)名前空間(BAR3を参照)を導入する前を宣言された変数を持っているだろうが、私は懐疑的だA)それはおそらくスケールではないでしょう大きい文書の場合は b)デフォルトの要素名前空間を「正しく」宣言することを妨げます。 e。ドキュメントヘッダー内の別の宣言を介してXQueryが意図しているとおりです。

希望の動作を達成する方法を知っている人はいますか?事前にどうもありがとうございました!

答えて

2

残念ながら、XQueryでは、XPath式の名前のデフォルト名前空間は、常に構成要素のデフォルト名前空間と同じです。

つの回避策は、計算要素コンストラクタを使用することです:

element Q{http://www.example.org}foo {  
    element Q{http://www.example.org}bar1 {$doc/a/b/c/text()} 
} 

私はそれはかなりありませんが、同意するものとします。

XSLT 2.0は、入力と出力のために別々のデフォルトの名前空間を持っています。私はXQuery WGにこれが必要であり失敗したことを説得しようとしたことを覚えています。

+1

入力と出力の別々のデフォルトネームスペースがその問題に大きな利益をもたらすことに同意します(そして、XQueryをより明示的に、より読みやすくすること)。これは利用できないため、XPath式ではワイルドカードを使用します(例:$ doc/*:a/*:b/*:c/text()) –