如何检查XQuery函数中的空日期参数?

时间:2009-06-15 15:36:35

标签: xquery

考虑以下检查空日期的代码:

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:

4 个答案:

答案 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)