首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPath-通配符不起作用的查询

XPath-通配符不起作用的查询
EN

Stack Overflow用户
提问于 2013-05-15 19:25:34
回答 3查看 258关注 0票数 1

我都快疯了。

谁能告诉我为什么这个查询不能工作:

代码语言:javascript
复制
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文档位于此集合中,如下所示:

代码语言:javascript
复制
<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>

谢谢,非常感谢伯特

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-15 19:39:07

您需要考虑命名空间,请参阅http://www.w3.org/TR/xquery/#id-default-namespace

代码语言:javascript
复制
declare default element namespace "http://rosa.openkernel/";
票数 2
EN

Stack Overflow用户

发布于 2013-05-15 19:40:04

这是一个名称空间问题。

代码语言:javascript
复制
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

或者,您可以使用以下命令声明默认命名空间

代码语言:javascript
复制
declare default element namespace "http://rosa.openkernel/";

并使用您到目前为止已有的代码。或者使用通配符选择所有名称空间的<uid/><value/>元素:

代码语言:javascript
复制
let $uid:=$item//*:uid/*:value
票数 1
EN

Stack Overflow用户

发布于 2017-10-03 18:46:20

你可以试着像bellow一样,它是用C#写的

声明XmlNamespaceManager的

XmlDocument文档=新XmlDocument();var namespaceManager =新XmlNamespaceManager(doc.NameTable);

  1. 使用XML阅读器或

的任何其他方式加载文档

Doc.Load(读卡器);namespaceManager.AddNamespace("a",doc.DocumentElement.NamespaceURI);

  1. 查询所需数据,如下所示

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16563772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档