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