user123187
user123187

Reputation: 21

How to check an empty date argument in a XQuery function?

Consider the following code which checks for an empty date:

declare xqse function tns:isEmptyDate($dob as xs:date) as xs:boolean {
    if(empty($dob)) then {
    }
}

When executed, why do I get the below error in 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:

Upvotes: 2

Views: 4849

Answers (4)

Curt
Curt

Reputation: 11

Use the function empty() instead of writing your own function. Empty will return true if a sequence has count zero, where xs:date? can be a sequence of length zero or one.

Upvotes: 1

Bill
Bill

Reputation:

Try this with a question mark or star after the type declaration.

E.g.,

$dob as xs:date means $dob is a sequence of 1 item (of type xs:date)

$dob as xs:date? means $dob is a sequence of 1 or none items (each of which are of type xs:date)

$dob as xs:date* means $dob is a sequence of none or more items (each of which are of type xs:date)

Upvotes: 1

brabster
brabster

Reputation: 43560

OK, I've had a look at this and I think you'll be able to run your query by defining your function as

declare function tns:isEmptyDate($dob as xs:date?) as xs:boolean

Note the ? after the type - it means that the argument may be the empty sequence.

I tested this out in Oxygen, using Saxon-B... sorry, I don't have access to the software you're using.

Here's my function definition.

declare function tns:isEmptyDate($dob as xs:date?) as xs:boolean {
    let $empty := if (empty($dob))
        then true()
        else false()
    return $empty
};

Running against this file:

<?xml version="1.0" encoding="UTF-8"?>
<datetime>2002-09-24</datetime>

returns true, and running against this file:

<?xml version="1.0" encoding="UTF-8"?>
<dontmatch>2002-09-24</dontmatch>

returns false.

Running the same function without the questionmark, on the second document, errors with:

Severity: error. Description: An empty sequence is not allowed as the first argument of tns:isEmptyDate()

Upvotes: 2

Kev
Kev

Reputation: 119806

I've only tinkered with XQuery, but I suspect that the error is being generated because the function signature ($dob as xs:date) requires a date type and you're passing something else e.g. an empty value.

Upvotes: 0

Related Questions