调试XQuery - XPTY0019错误

时间:2016-05-23 15:31:46

标签: java xml debugging xquery saxon

我目前正在尝试通过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命令,如果我删除它,代码运行正常。你能告诉我,我在那里做错了什么。

2 个答案:

答案 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的子元素,所以这一点永远不会有意义。