在命名空间环境中,XQuery / Xpath引用没有命名空间的xml元素

时间:2019-08-25 20:56:35

标签: xpath xquery exist-db

在Xquery 3.1中(在eXist-DB 4.7下),我收​​到这样的xml数据,没有名称空间:

 <edit-request  id="TC9999">
    <title-collection>foocolltitle</title-collection> 
    <title-exempla>fooextitle</title-exempla> 
    <title-short>fooshorttitle</title-short> 
 </edit-request>

这已分配给变量$content和以下语句:

let $collid := $content/edit-request/@id

...正确返回:TC9999

现在,我实际上需要将$content中的所有数据转换为TEI xml文档。

我首先需要从现有的TEI文件中获取一些信息,所以我分配了另一个变量:

 let $oldcontent := doc(concat($globalvar:URIdata,$collid,"/",$collid,".xml"))

然后我创建新的TEI文档,同时引用$content$oldcontent

 let $xml :=  <listBibl xmlns="http://www.tei-c.org/ns/1.0" 
                type="collection" 
                xml:id="{$collid}">
                   <bibl>
                      <idno type="old_sql_id">{$oldcontent//tei:idno[@type="old_sql_id"]/text()}</idno>
                      <title type="collection">{$content//title-exempla/text()}</title>
                   </bibl>
              </listBibl>

$oldcontent中TEI名称空间的引用会通过,但令我惊讶的是,对$content(无名称空间)的引用没有显示:

 <listBibl xmlns="http://www.tei-c.org/ns/1.0" 
            type="collection" 
            xml:id="TC9999">
    <bibl>
      <idno type="old_sql_id">1</idno>
      <title type="collection"/>
    </bibl>
 </listBibl>

问题是:如何在$content的上下文中引用let $xml=...中的非命名空间元素?

Nb:Xquery文档的顶部有一个声明(因为它实际上是所有文档的主要名称空间):

  declare namespace tei = "http://www.tei-c.org/ns/1.0";

1 个答案:

答案 0 :(得分:2)

本质上,您在问如何编写XPath表达式以在默认元素名称空间为非空的上下文中选择空名称空间中的节点。最直接的解决方案之一是使用“ URI加本地名称语法”编写QName。这是一个示例:

xquery version "3.1";

let $x := <x><y>Jbrehr</y></x>
return
  <p xmlns="foo">Hey there,
    { $x/Q{}y => string() }!</p>

如果该示例使用了路径表达式$x/Q{}y的更常见形式,而不是$x/y,则其结果将是一个空序列,因为本地名称y用于select <y>元素不指定名称空间,因此从其上下文继承foo元素名称空间。但是,通过使用“ URI加本地名称语法”,我们可以指定要查找的空名称空间。

有关此的更多信息,请参见XPath 3.1规范对扩展QName的讨论:https://www.w3.org/TR/xpath-31/#doc-xpath31-EQName