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



Question:

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:


Solution:1

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()


Solution:2

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.


Solution:3

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.


Solution:4

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)


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »