如何在 xquery 中调用函数
How do I call a function in xquery
Xml format is like:
<outer_element>
<list>
<leaf name="abc">
<D:a value=""/>
<D:b value="2"/>
<D:c value="3"/>
<D:text_enabled value="true"/>
</leaf>
<leaf name="xyz">
....
</leaf>
</list>
</outer_element>
这只是结构,下面是用于删除 xml 特定部分的 xquery:删除具有 D:text_enabled value="true"
的叶子
declare namespace my="my.uri";
declare variable $flag;
declare function my:isEnabled($node as node()) as xs:boolean
{
let $flag :=
for $child in $node/node()
return string-join(if(name($child) eq "D:text_enabled" and $child/@value eq "true") then "true" else "false" , " ")
return contains($flag,"true")
};
declare function my:filtering($node as node())
{
typeswitch ($node)
case element()
return
if (string(local-name($node)) = "import")
then
()
else
if(string(local-name($node)) = "leaf" and $flag=isEnabled($node) )
then
()
else
element
{
node-name($node)
} {
$node/@*
,
for $child in $node/node()
return my:filtering($child )
}
default
return
if (string(local-name($node)) = "import")
then
()
else
$node
};
let $input := doc("input.xml")
return
for $elem in $input/*
return
my:filtering($elem)
我遇到的错误是:
XPST0003:#...eclare 变量 $flag 中的 XQuery 语法错误;宣布#:
变量声明中需要 ':=' 或 'external'
XPST0008:#...中的 XQuery 静态错误 =“leaf”和 $flag=isEnabled#:
变量 $flag 尚未声明
查询中的静态错误
这与调用函数无关。
全局变量必须声明为外部变量,在这种情况下,值由调用应用程序提供:
declare variable $flag external;
或者必须初始化为一个值:
declare variable $flag := false();
但实际上,您根本没有使用全局变量,所以您只需删除声明即可。您有另一个完全独立的局部变量 $flag,它不需要全局声明。
一些进一步的建议:
if (string(local-name($node)) = "import")
最好写成 `if ($node[self::*:import])
据我所知,代码
让 $flag :=
对于 $node/node() 中的 $child
return string-join(if(name($child) eq "D:text_enabled" and $child/@value eq "true") then "true" else "false" , " " )
return 包含($flag,"true")
大概可以写成
exists($node/D:text_enabled[@value eq "true"])
Xml format is like:
<outer_element>
<list>
<leaf name="abc">
<D:a value=""/>
<D:b value="2"/>
<D:c value="3"/>
<D:text_enabled value="true"/>
</leaf>
<leaf name="xyz">
....
</leaf>
</list>
</outer_element>
这只是结构,下面是用于删除 xml 特定部分的 xquery:删除具有 D:text_enabled value="true"
的叶子declare namespace my="my.uri";
declare variable $flag;
declare function my:isEnabled($node as node()) as xs:boolean
{
let $flag :=
for $child in $node/node()
return string-join(if(name($child) eq "D:text_enabled" and $child/@value eq "true") then "true" else "false" , " ")
return contains($flag,"true")
};
declare function my:filtering($node as node())
{
typeswitch ($node)
case element()
return
if (string(local-name($node)) = "import")
then
()
else
if(string(local-name($node)) = "leaf" and $flag=isEnabled($node) )
then
()
else
element
{
node-name($node)
} {
$node/@*
,
for $child in $node/node()
return my:filtering($child )
}
default
return
if (string(local-name($node)) = "import")
then
()
else
$node
};
let $input := doc("input.xml")
return
for $elem in $input/*
return
my:filtering($elem)
我遇到的错误是:
XPST0003:#...eclare 变量 $flag 中的 XQuery 语法错误;宣布#: 变量声明中需要 ':=' 或 'external' XPST0008:#...中的 XQuery 静态错误 =“leaf”和 $flag=isEnabled#: 变量 $flag 尚未声明 查询中的静态错误
这与调用函数无关。
全局变量必须声明为外部变量,在这种情况下,值由调用应用程序提供:
declare variable $flag external;
或者必须初始化为一个值:
declare variable $flag := false();
但实际上,您根本没有使用全局变量,所以您只需删除声明即可。您有另一个完全独立的局部变量 $flag,它不需要全局声明。
一些进一步的建议:
if (string(local-name($node)) = "import")
最好写成 `if ($node[self::*:import])据我所知,代码
让 $flag :=
对于 $node/node() 中的 $child
return string-join(if(name($child) eq "D:text_enabled" and $child/@value eq "true") then "true" else "false" , " " )
return 包含($flag,"true")
大概可以写成
exists($node/D:text_enabled[@value eq "true"])