XPath-Query с подстановочным знаком не работает
Это сводит меня с ума.
Может кто-нибудь сказать мне, почему этот запрос не работает:
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/value объясняется тем, что я хочу использовать общий запрос
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>
Спасибо большое Берт
3 ответа
Вам необходимо принять во внимание пространство имен, см. http://www.w3.org/TR/xquery/:
declare default element namespace "http://rosa.openkernel/";
Это проблема пространства имен.
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
Вы можете попробовать как ниже, написано на C#
- объявление 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);
}