调试 XQuery - XPTY0019 错误

Debugging XQuery - XPTY0019 Error

我目前正在尝试通过 Java 运行 XQuery 文件。因为我是 XQuery 的新手,所以不确定如何调试它。当我 运行 XQ 时,出现以下错误:

XQuery 处理器异常:调用 Saxon 时出现异常:“/”的第一个操作数的必需项目类型是 node();提供的值具有项目类型 xs:anyAtomicType;系统编号:;行号:301;列号:-1; Cause: Error on line 301 XPTY0019: '/' 的第一个操作数所需的项目类型是 node();提供的值具有项目类型 xs:anyAtomicType

现在我想知道如何确定引发错误的行?

编辑:

if ($ipItems) then (
    for $item in $ipItems
       let $ipAddress := data ($item/nc:IpAddressList/nc:ipAddress)

经过无数次尝试,我终于找到了 let 命令的根本原因,如果我删除它,代码 运行 就没问题了。你能告诉我,我在那里做错了什么吗?

问题几乎可以肯定是这个路径表达式$item/nc:IpAddressList。问题是 $item 绑定到 xs:anyAtomicType 的值,而路径表达式仅在节点上运行。您应该进行一些调试以查看 $item 在运行时的值。

我无法准确理解您为此苦苦挣扎的原因。您向我们展示的代码片段大概位于查询的第 301 行附近。错误消息指的是“/”运算符,而您的查询中只有两个“/”运算符。第一个“/”运算符 (A) 的第一个操作数是 $item,第二个“/”运算符 (B) 的第一个操作数是 $item/nc:IpAddressList。如果B returns anything,它只能return个节点,所以它的静态类型是node()*,所以B不是问题。所以问题一定是A。$item的项目类型与$ipItems的项目类型相同,所以错误消息告诉你$ipItems包含原子值而不是节点。如果 Saxon 可以计算出 $ipItems 的值将始终包含原子值,它可能会在编译时给你这个错误,或者它可能会在 运行 时给你这个错误,如果 运行-时间值是原子的。在这种情况下,我怀疑这是一个编译时错误,因为对于 运行 时间错误,消息会更具体,例如它会告诉您 $item 可能是 xs:decimal,或者 xs:date.

现阶段我们无法再帮助您,因为我们需要查看 $ipItems 是如何初始化的。很有可能,它被初始化为一个只能是原子的值:一个例子可能是 let $ipItems := distinct-values(xx/yy/zz)。原子值不能有名为 nc:IpAddressList 的子元素,因此这永远没有意义。