Xquery 如何将节点从不同的命名空间复制到新文档?

Xquery 如何将节点从不同的命名空间复制到新文档?,xquery,marklogic,Xquery,Marklogic,我在MarkLogic中有一个名称空间为1的XML文档。现在我想从中复制一个节点,并将其粘贴到名称空间2中的另一个文档中 我编写了一个函数,用于从文档中获取这段数据(节点)。该函数返回文档2中位于命名空间1中的节点 我希望此节点也与根文档位于同一命名空间中 我可以将节点从其命名空间中剥离吗?然后将其插入另一个文档? 有没有其他程序可以达到预期的效果 这里是我的结果,请注意根命名空间与category元素命名空间不同 <wijk id="1027K01" xmlns="http://www.

我在MarkLogic中有一个名称空间为1的XML文档。现在我想从中复制一个节点,并将其粘贴到名称空间2中的另一个文档中

我编写了一个函数,用于从文档中获取这段数据(节点)。该函数返回文档2中位于命名空间1中的节点

我希望此节点也与根文档位于同一命名空间中

我可以将节点从其命名空间中剥离吗?然后将其插入另一个文档? 有没有其他程序可以达到预期的效果

这里是我的结果,请注意根命名空间与category元素命名空间不同

<wijk id="1027K01" xmlns="http://www.nvsp.nl/wijk">
  <meta-data>
    <!--Generated by DIKW for NetwerkVSP STT!P -->
    <version>0.4</version>
    <dateCreated>2015-02-22+01:00</dateCreated>
  </meta-data>
  <category name="Geografie" xmlns="http://www.cendris.nl/postcode">
    <variable name="Postcode">
      <segment name="6 positie postcode">1027AA</segment>
      <segment name="5 positie postcode">1027A</segment>
      <segment name="4 positie postcode">1027</segment>
    </variable>
    <variable name="Gemeente">
      <segment name="Gemeentecode">363</segment>
      <segment name="Gemeentenaam">Amsterdam</segment>
    </variable>
    <variable name="Plaats">
      <segment name="Plaatsnaam">AMSTERDAM</segment>
    </variable>
    <variable name="Provincie">
      <segment name="Provinciecode">27</segment>
      <segment name="Provincienaam">Noord-Holland</segment>
    </variable>
    <variable name="Cebuco">
      <segment name="Cebuco naam">(21) Amsterdam-Purmerend</segment>
      <segment name="Cebuco code">21</segment>
    </variable>
    <variable name="Bible Belt">
      <segment name="nauwelijks">100</segment>
      <segment name="enigszins">0</segment>
      <segment name="redelijk sterk">0</segment>
      <segment name="sterk">0</segment>
      <segment name="zeer sterk">0</segment>
    </variable>
    <variable name="Urbanisatiegraad">
      <segment name="Zeer sterk stedelijk">100</segment>
      <segment name="Sterk stedelijk">0</segment>
      <segment name="Matig stedelijk">0</segment>
      <segment name="Weinig stedelijk">0</segment>
      <segment name="Niet stedelijk">0</segment>
    </variable>
  </category>
</wijk>

0.4
2015-02-22+01:00
1027AA
1027A
1027
363
阿姆斯特丹
阿姆斯特丹
27
北荷兰省
(21)阿姆斯特丹Purmerend
21
100
0
0
0
0
100
0
0
0
0

您可以通过仅使用本地名称递归地重新构造节点及其子节点,从而从节点中剥离名称空间。可以使用类似的方法将节点从一个命名空间移动到另一个命名空间

注意:从节点中剥离名称空间会将该节点放入“空”名称空间。该节点将保留在“空”名称空间中,即使它被放置为不同名称空间节点的子节点

下面是XQuery中的一些名称空间操作示例:

xquery version "1.0-ml";

declare namespace html = "http://www.w3.org/1999/xhtml";
declare namespace other = "other";

declare function local:remove-namespace($x as node()) as node()?
{
  if ($x instance of element())
  then
    element { fn:local-name($x) }  {
      $x/(@*,node()) ! local:remove-namespace(.)
    }
  else $x
};

declare function local:set-namespace($x as node(), $prefix as xs:string) as node()?
{
  if ($x instance of element())
  then
    element { xs:QName($prefix || ":" || fn:local-name($x)) }  {
      $x/(@*,node()) ! local:set-namespace(., $prefix)
    }
  else $x
};

let $x := <html:p>blah, blah <html:strong>__</html:strong> blah</html:p>
return (
  $x,
  local:remove-namespace($x),
  local:set-namespace($x, "other")
)
xquery版本“1.0-ml”;
声明命名空间html=”http://www.w3.org/1999/xhtml";
声明命名空间other=“other”;
将函数声明为本地:是否将命名空间($x作为节点())作为节点()删除?
{
if($x元素()的实例)
然后
元素{fn:本地名称($x)}{
$x/(@*,node())!本地:删除命名空间()
}
其他$x
};
声明函数local:set namespace($x为node(),$prefix为xs:string)为node()?
{
if($x元素()的实例)
然后
元素{xs:QName($prefix | |“:“| | fn:localname($x))}{
$x/(@*,node())!local:设置命名空间(,,$prefix)
}
其他$x
};
让$x:=诸如此类,诸如此类
返回(
$x,
本地:删除名称空间($x),
本地:设置命名空间($x,“其他”)
)
按照以下顺序评估该样本:

<html:p xmlns:html="http://www.w3.org/1999/xhtml">blah, blah <html:strong>__</html:strong> blah</html:p>,
<p>blah, blah <strong>__</strong> blah</p>,
<other:p xmlns:other="other">blah, blah <other:strong>__</other:strong> blah</other:p>
诸如此类,诸如此类,
诸如此类,诸如此类,
等等,等等

命名空间节点在XQuery数据模型中并不是真正的一等公民。XQuery工作组显然认为不应该允许我们操纵它们。但也有一些技巧可用

下面是一个使用8.0-1.1测试的示例:

declare function local:do(
  $n as node(), $ns as xs:string)
as node()
{
  typeswitch($n)
  case document-node() return document { local:do($n/node(), $ns) }
  case element() return element { QName($ns, local-name($n)) } {
    $ns,
    $n/@*,
    local:do($n/node(), $ns) }
  default return $n
};

<test xmlns="a">
  <fubar><baz/></fubar>
</test>
! local:do(., "b")
这会将
xmlns:b
声明提升到根元素的级别


最后,您有时可以使用带有默认名称空间选项的
xdmp:quote
和执行一些技巧。

有一个简单的方法:使用函数。functx库与MarkLogic一起分发。导入它们,使用“”作为新命名空间调用该函数,然后就可以了

您可以使用以下导入行:
导入模块命名空间functx=”http://www.functx.com“at”/MarkLogic/functx/functx-1.0-nodoc-2007-01.xqy”。在ML8中也应该如此。。
<test xmlns="a">
  <b:fubar xmlns:b="b"><baz/></b:fubar>
  <b:fubar xmlns:b="b"><buz/></b:fubar>
</test>
! element { node-name(.) } {
  node()/namespace::*,
  @*,
  node() }