2011-05-23 95 views
0

我試圖檢查命名空間「X」的節點是否具有不同命名空間「Y」的子節點。我嘗試了以下xquery:xquery:查找父節點是否具有不同命名空間的子節點

declare namespace atom = "http://www.w3.org/2005/Atom"; 
declare namespace libx = "http://libx.org/xml/libx2"; 

let $doc := <node><entries xmlns="http://www.w3.org/2005/Atom" xmlns:libx="http://libx.org/xml/libx2"> 
      <libx:book-entry><book>Book 1</book><author>Author 1 PQR</author><title>Title 1</title></libx:book-entry> 
      <libx:car-entry><car>Car 1</car><model>Model 1</model><price>Price 1 PQR</price></libx:car-entry> 
      </entries></node>, 
    $types := <types xmlns="http://libx.org/xml/libx2"><type>book-entry</type></types>, 
    $key := 'PQR' 

for $type in $types/libx:type 
return 
    for $entry in $doc/atom:entries/*[name() eq $type] 
    return $entry 

我期望的結果是:<libx:book-entry><book>Book 1</book><author>Author 1 PQR</author><title>Title 1</title></libx:book-entry>。但是,查詢返回null,因爲名稱函數不考慮不同的名稱空間。除name()之外是否還有另一個xquery函數,該函數接受一個名稱空間參數,該名稱空間參數將提供所需的結果。

感謝, 索尼

回答

0

您可以使用local-name()功能只匹配的元素的本地名稱(如您已在$類型列出它們)。

或者,如果您想具體說明,則可以使用local-name()namespace-uri()的組合來匹配元素名稱和名稱空間URI。

+0

謝謝:)索尼 – sony 2011-05-23 08:50:22

0

表達

$X[namespace-uri() != */namespace-uri()] 

將選擇在$ X中至少有一個子元素,其名稱空間URI不等於父元素的命名空間URI的所有元素。這是使用「!=」作爲隱含存在的罕見例子(對於序列中的任何成員來說都是如此)。

相關問題