Marklogic 具有默认命名空间的序列化结构化查询
在我的应用程序中,我接收到一个字符串形式的序列化结构化查询。我需要将此字符串转换为查询并执行查询 我使用Marklogic 具有默认命名空间的序列化结构化查询,marklogic,Marklogic,在我的应用程序中,我接收到一个字符串形式的序列化结构化查询。我需要将此字符串转换为查询并执行查询 我使用cts:query构造查询: declare namespace search = "http://marklogic.com/appservices/search"; (: External string variable received by the application. :) let $query := "" || "<search:search xmlns:searc
cts:query
构造查询:
declare namespace search = "http://marklogic.com/appservices/search";
(: External string variable received by the application. :)
let $query := "" ||
"<search:search xmlns:search='http://marklogic.com/appservices/search'>" ||
" <element-value-query xmlns='http://marklogic.com/cts'>" ||
" <element>element</element>" ||
" <text>value</text>" ||
" </element-value-query>" ||
"</search:search>"
(: extract cts query from search. :)
let $q := document {
xdmp:unquote($query)/search:search/*
}
(: construct cts query. :)
return cts:query($q/*)
默认名称空间也用作“元素”的名称空间。我想这是我们想要的行为
- 有没有办法防止这种情况?我希望使用默认的cts名称空间,同时使用没有名称空间的元素
希望这是有用的,在本例中,您确实需要一个前缀来区分cts:query元素本身和您正在寻址的索引元素。但是,没有什么可以阻止您自己更改前缀。你可以这样做:
xquery version "1.0-ml";
declare function local:qname($node, $ns, $prefix) {
if (fn:namespace-uri($node) eq $ns) then
if ($prefix eq '') then
QName($ns, local-name($node))
else
QName($ns, $prefix || ":" || local-name($node))
else
node-name($node)
};
declare function local:change-prefix(
$nodes as node()*,
$ns as xs:string,
$prefix as xs:string
)
as node()*
{
for $node in $nodes
return
typeswitch ($node)
case element() return
element { local:qname($node, $ns, $prefix) } {
$node/@*,
local:change-prefix($node/node(), $ns, $prefix)
}
case document-node() return
document {
local:change-prefix($node/node(), $ns, $prefix)
}
default return $node
};
cts:query(
local:change-prefix(
<element-value-query xmlns="http://marklogic.com/cts">
<element>myelement</element>
<text xml:lang="en">some text</text>
</element-value-query>,
"http://marklogic.com/cts",
"cts"
)
)
xquery版本“1.0-ml”;
声明函数本地:qname($node,$ns,$prefix){
如果(fn:namespace uri($node)eq$ns)那么
如果($prefix eq“”),则
QName($ns,本地名称($node))
其他的
QName($ns,$prefix | |“:“| |本地名称($node))
其他的
节点名称($node)
};
声明函数本地:更改前缀(
$nodes作为node()*,
$ns作为xs:string,
$prefix作为xs:string
)
作为节点()*
{
对于$node中的$node
返回
类型开关($node)
case元素()返回
元素{local:qname($node,$ns,$prefix)}{
$node/@*,
本地:更改前缀($node/node(),$ns,$prefix)
}
案例文档-node()返回
文件{
本地:更改前缀($node/node(),$ns,$prefix)
}
默认返回$node
};
cts:查询(
本地:更改前缀(
myelement
一些文本
,
"http://marklogic.com/cts",
“cts”
)
)
嗯 +1表示将默认名称空间视为反实践。但是,我无法使用
xdmp:with namespace
实现这一点。
xquery version "1.0-ml";
cts:query(
<element-value-query xmlns="http://marklogic.com/cts">
<element>element</element>
<text>value</text>
</element-value-query>
),
cts:query(
<cts:element-value-query xmlns:cts="http://marklogic.com/cts">
<cts:element>element</cts:element>
<cts:text>value</cts:text>
</cts:element-value-query>
)
cts:element-value-query(fn:QName("http://marklogic.com/cts","element"), "value", ("lang=en"), 1)
cts:element-value-query(fn:QName("","element"), "value", ("lang=en"), 1)
xquery version "1.0-ml";
declare function local:qname($node, $ns, $prefix) {
if (fn:namespace-uri($node) eq $ns) then
if ($prefix eq '') then
QName($ns, local-name($node))
else
QName($ns, $prefix || ":" || local-name($node))
else
node-name($node)
};
declare function local:change-prefix(
$nodes as node()*,
$ns as xs:string,
$prefix as xs:string
)
as node()*
{
for $node in $nodes
return
typeswitch ($node)
case element() return
element { local:qname($node, $ns, $prefix) } {
$node/@*,
local:change-prefix($node/node(), $ns, $prefix)
}
case document-node() return
document {
local:change-prefix($node/node(), $ns, $prefix)
}
default return $node
};
cts:query(
local:change-prefix(
<element-value-query xmlns="http://marklogic.com/cts">
<element>myelement</element>
<text xml:lang="en">some text</text>
</element-value-query>,
"http://marklogic.com/cts",
"cts"
)
)