如何在 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"])