2014-02-20 50 views
0

是否有可能通過前綴返回到沒有命名空間?在當默認的命名空間中XQuery是設定換句話說,我怎麼把在元素沒有命名空間或我怎麼沒有的命名空間創建一個元素?XQuery:返回到沒有命名空間

我的問題是,我從A-> B,在那裏我現在意識到,B預計其子女爲不合格定義的映射的Xquery。在映射中,我將默認名稱空間設置爲a並始終爲合格b。如果我從bs子項中刪除nsprefix,則應用NS。例如

這是期望得到的XML:

<myB:StatusEvent xmlns:myB="http://b"> 
<Action/> <!-- note Action has no, not even an inherited, namespace --> 
</myB:StatusEvent> 

,而這是在我的XQuery映射典型前綴使用:

declare default element namespace "http://a"; 
let $elem := doc("someinput.xml")/somePathWithoutMyAPrefix 
(: note the xpath expressions use the default a namespace :) 
return 
<myB:StatusEvent>{$elem/someVal} 
    <myNN:Action> (: <== how do I create Action **without** a namespace? :) 
</myB:StatusEvent> 
+0

很難告訴你想達到什麼,既是你的XML片段,你的XQuery代碼無效。 –

+0

這些片段是爲了描繪一般想法,我已經將它們更新爲有效的代碼。 –

回答

2

你聲明使用默認的命名空間是僅爲方便查詢本身。我認爲你想要做的是真的從某個元素中刪除名稱空間。你可以做這樣的事情,像這樣一個遞歸函數:

declare function local:remove-namespace ($node as node()) { 
    typeswitch ($node) 
    case element() 
     return element { local-name($node) } {$node/@*, for $child in $node/node() return local:remove-namespace($child) } 
    default 
    return $node 
}; 

只要叫上您不想命名空間的元素這個方法(這是不是從你的例子徹底清除)。

3

我真的建議不要使用declare default element namespace "http://a";。特別是如果其他開發人員沒有注意到它在使用中,並且花費了很多年時間試圖弄清楚爲什麼他們會得到意想不到的結果,這是非常邪惡的。

話雖這麼說,有些實現可以支持使用xmlns=""一個元素放回默認默認命名空間。例如

declare default element namespace "http://a"; 

<a> 
    <other xmlns=""/> 
</a> 

據我所知,這不能通過前綴來完成。

+0

這將聲明其他中的* default *名稱空間不是名稱空間,但其他名稱空間仍然位於NS的NS中。 –

+0

Stefan K.,是什麼讓你認爲'other'會在命名空間'a'中?正如您正確指出的那樣,'other'元素沒有默認名稱空間;它不僅適用於'other'元素的內容,而且也適用於其前綴不固定的QName:名稱空間聲明的解析,它們適用於它們出現在其開始標記處的元素,而不僅僅適用於該元素的內容。 –