我目前正在尝试通过Java运行XQuery文件。由于我是XQuery的新手,不知道如何调试它。当我运行XQ时,我收到以下错误:
XQuery Processor Exception:调用Saxon时出现异常:'/'的第一个操作数的必需项类型是node();提供的值具有项类型xs:anyAtomicType; SystemID :;行#:301;列#: - 1;原因:301行上的错误XPTY0019:'/'的第一个操作数的必需项类型是node();提供的值具有项类型xs:anyAtomicType
现在我想知道如何确定引发错误的行?
编辑:
if ($ipItems) then (
for $item in $ipItems
let $ipAddress := data ($item/nc:IpAddressList/nc:ipAddress)
经过多次尝试后,我终于将根casue指向let命令,如果我删除它,代码运行正常。你能告诉我,我在那里做错了什么。
答案 0 :(得分:2)
问题几乎可以肯定是这个路径表达式$item/nc:IpAddressList
。问题是$item
绑定到xs:anyAtomicType
的值,而路径表达式只在节点上运行。您应该进行一些调试,以查看$item
在运行时的值。
答案 1 :(得分:1)
我很难理解你为什么要为此而苦苦挣扎。您向我们展示的代码片段大概是在查询的第301行附近。错误消息指的是" /"运营商,只有两个" /"您的查询中的运算符。第一个" /"的第一个操作数运算符(A)是$item
,第二个" /"的第一个操作数是运算符(B)是$item/nc:IpAddressList
。如果B返回任何东西,它只能返回节点,所以它的静态类型是node()*,所以B不是问题。所以问题必须是A. $item
的项类型与$ipItems
的项类型相同,因此错误消息告诉您$ipItems
包含原子值而不是节点。如果可以确定$ipItems
的值总是包含原子值,Saxon可能会在编译时给你这个错误,或者如果运行时值是原子的话,它可能会在运行时给你错误。在这种情况下,我怀疑它是编译时错误,因为对于运行时错误,消息将更具体,例如,它会告诉你$ item是xs:decimal
,也许是xs:date
。
在此阶段,我们无法再为您提供帮助,因为我们需要了解$ipItems
的初始化方式。机会是,它被初始化为一个只能是原子的值:一个例子可能是let $ipItems := distinct-values(xx/yy/zz)
。原子值不能有一个名为nc:IpAddressList
的子元素,所以这一点永远不会有意义。