2013-05-15 40 views
1

這讓我瘋狂。帶通配符不工作的XPath查詢

誰能告訴我,爲什麼這個查詢不起作用:

xquery version "3.0"; 
for $item in collection("openkernel/openehr_ehr/archetyped/") 
let $uid:=$item//uid/value 
where $uid="51160740-171e-487c-a04d-eae267f7079a" 
return $item 

必須是愚蠢的東西,我知道了。前// UID /值的雙斜線是因爲我想用查詢通用

的XML文檔我試圖找到居住在此集合,並且是這樣的:

<openehr-ehr_rm-Composition.composition.v1 xmlns="http://rosa.openkernel/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://rosa.openkernel/ file:/openehr-ehr_rm-Composition.composition.v1.xsd"> 
<Composition archetype_id="openehr-ehr_rm-Composition.composition.v1"> 
    <archetype_id> 
     <value>openehr-ehr_rm-Composition.composition.v1</value> 
    </archetype_id> 
    <category> 
     <defining_code> 
      <code_string>431</code_string> 
      <terminology_id> 
       <value>openehr</value> 
      </terminology_id> 
     </defining_code> 
     <value>persistent</value> 
    </category> 
    <something>a composition</something> 
    <uid> 
     <value>0e15d0f2-0b59-4df7-88f8-27be87e1e2ac</value> 
    </uid> 
    <content archetype_id="openehr-ehr_rm-ADMIN_ENTRY.admin_entry.v1" archetype_node_id="at0002"> 
     <archetype_id> 
      <value>openehr-ehr_rm-ADMIN_ENTRY.admin_entry.v1</value> 
     </archetype_id> 
     <an_item>nono</an_item> 
     <an_other_item>an_other_item</an_other_item> 
     <something>an admin_entry</something> 
     <uid> 
      <value>51160740-171e-487c-a04d-eae267f7079a</value> 
     </uid> 
    </content> 
</Composition> 
</openehr-ehr_rm-Composition.composition.v1> 

謝謝,非常多 伯特

回答

0

這是一個命名空間的問題。

xquery version "3.0"; 
declare namespace rosa = "http://rosa.openkernel/"; 

for $item in collection("openkernel/openehr_ehr/archetyped/") 
let $uid:=$item//rosa:uid/rosa:value 
where $uid="51160740-171e-487c-a04d-eae267f7079a" 
return $item 

或者,你可以聲明使用

declare default element namespace "http://rosa.openkernel/"; 

默認的命名空間,並使用你有迄今的代碼。或者你選擇使用通配符所有命名空間<uid/><value/>元素是:

let $uid:=$item//*:uid/*:value 
+0

感謝您的回答,非常有幫助。 –

0

你可以嘗試像波紋管,其在C#編寫

  1. 宣佈XmlNamespaceManager的

XmlDocument doc = new XmlDocument(); var namespaceManager = new XmlNamespaceManager(doc.NameTable);

使用XML讀取器或任何其他方式

doc.Load(讀取器)

  • 裝入文檔; namespaceManager.AddNamespace(「a」,doc.DocumentElement.NamespaceURI);

  • 查詢所需數據作爲波紋管
  • HierObjectId uid = null; 
    XmlNode uidNode = doc.SelectSingleNode("//a:archetype/a:uid/a:value", namespaceManager); 
    if (uidNode == null) 
    { 
        uid = HierObjectId.NewObjectId(); 
    } 
    else 
    { 
        uid = new HierObjectId(uidNode.InnerText); 
    }