考虑以下检查空日期的代码:
declare xqse function tns:isEmptyDate($dob as xs:date) as xs:boolean {
if(empty($dob)) then {
}
}
执行时,为什么我在ALDSP中收到以下错误:
weblogic.xml.query.exceptions.XQueryDynamicException: {err}XP0021: "": can not cast to {http://www.w3.org/2001/XMLSchema}date: error: date: Invalid date value: wrong type:
答案 0 :(得分:2)
好的,我已经看过这个了,我想你可以通过定义你的函数来运行你的查询
declare function tns:isEmptyDate($dob as xs:date?) as xs:boolean
注意?在类型之后 - 这意味着参数可能是空序列。
我使用Saxon-B在Oxygen中测试了这个...抱歉,我无法访问您正在使用的软件。
这是我的功能定义。
declare function tns:isEmptyDate($dob as xs:date?) as xs:boolean {
let $empty := if (empty($dob))
then true()
else false()
return $empty
};
针对此文件运行:
<?xml version="1.0" encoding="UTF-8"?>
<datetime>2002-09-24</datetime>
返回true,并针对此文件运行:
<?xml version="1.0" encoding="UTF-8"?>
<dontmatch>2002-09-24</dontmatch>
返回false。
在第二个文档上运行没有问号的相同功能,错误:
严重性:错误。描述:不允许空序列作为tns的第一个参数:isEmptyDate()
答案 1 :(得分:1)
使用函数empty()
而不是编写自己的函数。如果序列的计数为零,则Empty将返回true,其中xs:date?
可以是长度为零或一的序列。
答案 2 :(得分:0)
我只修改了XQuery,但我怀疑是因为函数签名($dob as xs:date)
需要日期类型而你正在传递其他内容,因此会生成错误。空值。
答案 3 :(得分:0)
在类型声明后尝试使用问号或星号。
,例如,
$ dob as xs:date 表示$ dob是1个项目的序列(类型为xs:date)
$ dob as xs:date? 表示$ dob是1或无项目的序列(每个项目的类型为xs:date)
$ dob as xs:date * 表示$ dob是一个没有或多个项目的序列(每个项目的类型为xs:date)