0

我有一个函数,它接受一个节点,如果节点是一组节点的一部分,则返回 true 或 false 例如我有这个 xml 文档:

    <person>
     <name> Joseph </name>
     <child> Mary </child>
     <mother> Janet </mother>
     <father> Fred </father>
    </person>

如果传入的节点是父亲或名称,我有一个应该返回 true 的函数,它应该返回 true 但我收到此错误 Axis step child::element cannot be used here: the context item is not

我不确定我在这里做错了什么

    declare function local:findNode($node as element())
    {
      for $s in person/(name,father)
      return
        if($s = $node)
         then true()
        else false()
    };
4

1 回答 1

1

在您的函数中,表达式person/(name,father)没有上下文。更新函数以接受 person 元素作为变量并将其用作上下文:$person/(name, father).

此外,因为它使用 a 迭代(name, father)序列for,所以该函数将返回多个布尔变量 - 一个 forname和一个 for father。如果您将值序列与传入的值进行比较,如果序列中的任何值评估为 true,则返回 true,如果它们全部为 false,则返回 false,这听起来像您想要的:

declare function local:findNode(
  $node as element(),
  $person as element(person)
) as xs:boolean
{
  $person/((name, father)=$node)
}; 

let $person :=
<person>
 <name> Joseph </name>
 <child> Mary </child>
 <mother> Janet </mother>
 <father> Fred </father>
</person>
let $node := <name> Rick </name>
return local:findNode($node, $person)
于 2013-10-14T20:16:52.593 回答