Functions That Extract Data from Date/Time ValuesThere is an entire set of functions designed to let you work with date/time values by extracting data from those values:
Each of these functions has its own syntax and usage, so we'll take a look at them briefly . The fn:get-years-from-yearMonthDuration FunctionThis function lets you extract the year component of an xdt:yearMonthDuration value. Here's how it works: fn:get-years-from-yearMonthDuration( $srcval as xdt:yearMonthDuration?) as xs:integer? This function returns an xs:integer representing the value of the year component of $srcval , which may be negative. You can see an example in ch11_03.xsl (Listing 11.3), where we're extracting the years from the duration "P20Y03M" (20 years, 3 months). Note that to use xdt:yearMonthDuration values, we have to add an xmlns:xdt attribute to declare the xdt namespace: "http://www.w3.org/2003/05/xpath-datatypes". Listing 11.3 Using fn:get-years-from-yearMonthDuration ( ch11_03.xsl )<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xdt="http://www.w3.org/2003/05/xpath-datatypes" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="/"> <xsl:value-of select="get-years-from-yearMonthDuration( xdt:yearMonthDuration('P20Y03M'))"/> </xsl:template> </xsl:stylesheet> As you'd expect, this is the result when you use this example in Saxon: <?xml version="1.0" encoding="UTF-8"?> 20 The fn:get-months-from-yearMonthDuration FunctionThis function just lets you extract the value of the month component of an xdt:yearMonthDuration value. Here's how you use it: fn:get-months-from-yearMonthDuration( $srcval as xdt:yearMonthDuration?) as xs:integer? This function returns an xs:integer representing the month component of $srcval , which may be negative. For example, fn:get-months-from-yearMonthDuration(xdt:yearMonthDuration("P20Y03M")) returns 3. The fn:get-days-from-dayTimeDuration FunctionThe fn:get-days-from-dayTimeDuration function lets you extract the value of the day component from an xdt:dayTimeDuration value. Here's how you use it: fn:get-days-from-dayTimeDuration( $srcval as xdt:dayTimeDuration?) as xs:integer? This function returns an xs:integer representing the value of the day component of $srcval , which may be negative. You can see an example in ch11_04.xsl (Listing 11.4), where we're extracting the number of days from the xs:dayTimeDuration value "P5DT11H" (5 days, 11 hours). Listing 11.4 Using fn:get-days-from-dayTimeDuration ( ch11_04.xsl )<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xdt="http://www.w3.org/2003/05/xpath-datatypes" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="/"> <xsl:value-of select="get-days-from-dayTimeDuration( xdt:dayTimeDuration('P5DT11H'))"/> </xsl:template> </xsl:stylesheet> And here's the result5 days: <?xml version="1.0" encoding="UTF-8"?> 5 The fn:get-hours-from-dayTimeDuration FunctionThe fn:get-hours-from-dayTimeDuration function lets you extract the value of the hour component of an xdt:dayTimeDuration value. Here's how you use it: fn:get-hours-from-dayTimeDuration( $srcval as xdt:dayTimeDuration?) as xs:integer? This function returns an xs:integer containing the value of the hour component of $srcval , which may be negative. Here's an example: fn:get-hours-from-dayTimeDuration(xdt:dayTimeDuration("P5DT11H")) returns 11. The fn:get-minutes-from-dayTimeDuration FunctionThis function lets you extract the value of the minute component from an xdt:dayTimeDuration value. Here's how you use it: fn:get-minutes-from-dayTimeDuration( $srcval as xdt:dayTimeDuration?) as xs:integer? This function returns an xs:integer representing the minute component of $srcval , which may be negative. You can see an example in ch11_05.xsl (Listing 11.5), where we're extracting the minutes from the xdt:dayTimeDuration value "P3DT11H22M". Listing 11.5 Using fn:get-minutes-from-dayTimeDuration ( ch11_05.xsl )<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xdt="http://www.w3.org/2003/05/xpath-datatypes" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="/"> <xsl:value-of select="get-minutes-from-dayTimeDuration( xdt:dayTimeDuration('P3DT11H22M'))"/> </xsl:template> </xsl:stylesheet> And here's the result when you use Saxon22 minutes: <?xml version="1.0" encoding="UTF-8"?> 22 The fn:get-seconds-from-dayTimeDuration FunctionAs you can guess from its name , this function extracts the value of the second component from an xdt:dayTimeDuration value. Here's the signature for this function: fn:get-seconds-from-dayTimeDuration( $srcval as xdt:dayTimeDuration?) as xs:decimal? This function just returns an xs:decimal value representing the value of the second component of $srcval , which may be negative. Here's an example: fn:get-seconds-from-dayTimeDuration(xdt:dayTimeDuration("P5DT11H23.4S")) returns 23.4. The fn:get-year-from-dateTime FunctionThis function extracts the year from xs:dateTime values. Here's its signature: fn:get-year-from-dateTime( $srcval as xs:dateTime?) as xs:integer? This function returns an xs:integer representing the value of the year component of $srcval , which may be negative. Here's an example where we're checking the year of someone's birthday. In this case, we'll check if that year is before or after 1900, as you can see in ch11_06.xsl (Listing 11.6). Listing 11.6 Using fn:get-year-from-dateTime ( ch11_06.xsl )<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:variable name="birthday" select="xs:dateTime('1899-07-04T19:21:00-05:00')" /> <xsl:template match="/"> <xsl:value-of select="if (get-year-from-dateTime($birthday) lt 1900) then 'Getting kind of old, eh?' else 'Happy Birthday!'"/> </xsl:template> </xsl:stylesheet> And here's the result: <?xml version="1.0" encoding="UTF-8"?> Getting kind of old, eh? The fn:get-month-from-dateTime FunctionThis function just extracts the month from xs:dateTime values, and here's how you use it: fn:get-month-from-dateTime( $srcval as xs:dateTime?) as xs:integer? This function returns an xs:integer between 1 and 12, inclusive, representing the value of the month component of $srcval . Here's an example: fn:get-month-from-dateTime(xs:dateTime("2004-07-11T19:21:00-05:00")) returns 7. The fn:get-day-from-dateTime FunctionThis function returns the value of the day component from an xs:dateTime value, like this: fn:get-day-from-dateTime( $srcval as xs:dateTime?) as xs:integer? When called, this function returns an xs:integer between 1 and 31, inclusive, representing the value of the day component of $srcval . Here's an example: fn:get-day-from-dateTime(xs:dateTime("2004-05-31T13:20:00-05:00")) returns 31. The fn:get-hours-from-dateTime FunctionThe fn:get-hours-from-dateTime function extracts the value of the hour component from xs:dateTime values, and here's what this function looks like: fn:get-hours-from-dateTime( $srcval as xs:dateTime?) as xs:integer? Here, this function returns an xs:integer between 0 and 23, inclusive, representing the value of the hour component of $srcval . And here's an example: fn:get-hours-from-dateTime(xs:dateTime("2004-11-09T12:00:00")) returns 12. The fn:get-minutes-from-dateTime FunctionAs you can guess from its name, the fn:get-minutes-from-dateTime function extracts the value of the minute component from an xs:dateTime value, like this: fn:get-minutes-from-dateTime( $srcval as xs:dateTime?) as xs:integer? This function returns an xs:integer value between 0 and 59, inclusive, containing the value of the minute component of $srcval . The fn:get-seconds-from-dateTime FunctionThe fn:get-seconds-from-dateTime function extracts the value of the second component from xs:dateTime values, like this: fn:get-seconds-from-dateTime( $srcval as xs:dateTime?) as xs:decimal? When called, this function returns an xs:decimal value between 0 and 60.999..., inclusive, corresponding to the value of the second component in $srcval (the value can be greater than 60 seconds to allow for leap seconds). Here's an example: fn:get-seconds-from-dateTime(xs:dateTime("2004-08-19T11:30:29-05:00")) returns 29. The fn:get-timezone-from-dateTime FunctionThis function lets you determine the timezone of an xs:dateTime value, and here's how you use it: fn:get-timezone-from-dateTime($srcval as xs:dateTime?) as xdt:dayTimeDuration? The fn:get-timezone-from-dateTime function returns the timezone component of $srcval as an xdt:dayTimeDuration value indicating the difference from UTC (its value may range from +14:00 to 14:00 hours, inclusive). For example, this expression returns an xdt:dayTimeDuration value of "-PT5H": fn:get-timezone-from-dateTime(xs:dateTime("2004-08-19T11:30:29-05:00")) The fn:get-year-from-date FunctionAs you can gather from this function's name, it extracts the year from an xs:date value. Here's how you use this function: fn:get-year-from-date( $srcval as xs:date?) as xs:integer? This function returns an xs:integer value containing the value of the year component of $srcval , which may be negative. For example, fn:get-year-from-date(xs:date("2004-09-01")) returns 2004. The fn:get-month-from-date FunctionThe fn:get-month-from-date function just gets the month from xs:date values, and here's how you use it: fn:get-month-from-date( $srcval as xs:date?) as xs:integer? This function returns an xs:integer between 1 and 12, inclusive, containing the value of the month component of $srcval . For example, fn:get-month-from-date(xs:date("2004-03-11+05:00")) returns 3. The fn:get-day-from-date FunctionThis function returns the day component of xs:date values: fn:get-day-from-date($srcval as xs:date?) as xs:integer? The value returned is an xs:integer between 1 and 31, inclusive, containing the day component of $srcval . For example, fn:get-day-from-date(xs:date("2004-03-11+05:00")) returns 11. The fn:get-timezone-from-date FunctionThis function extracts the timezone from xs:date values: fn:get-timezone-from-date( $srcval as xs:date?) as xdt:dayTimeDuration? The value returned is the timezone component of $srcval as an xdt:dayTimeDuration value that indicates the difference from UTC (its value may range from +14:00 to 14:00 hours, inclusive). For example, fn:get-timezone-from-date(xs:date("2004-03-11+05:00")) returns an xdt:dayTimeDuration value of "-PT5H". The expression fn:get-timezone-from-date(xs:date("2004-09-12Z")) returns the xdt:dayTimeDuration value of PT0H. The fn:get-hours-from-time FunctionThis function retrieves the value of the hour component of an xs:time value: fn:get-hours-from-time( $srcval as xs:time?) as xs:integer? The returned value is an xs:integer between 0 and 23, inclusive, representing the value of the hour component of $srcval . For example, fn:get-hours-from-time(xs:time("10:37:00")) returns 10 and fn:get-hours-from-time(xs:time("02:19:27+05:00")) returns 21. The fn:get-minutes-from-time FunctionThe fn:get-minutes-from-time function returns the minute component from an xs:time value: fn:get-minutes-from-time( $srcval as xs:time?) as xs:integer? The return value is an xs:integer value between 0 to 59, inclusive, containing the value of the minute component of $srcval . For example, fn:get-minutes-from-time(xs:time("14:23:19")) returns 23. The fn:get-seconds-from-time FunctionThis function returns the second component from an xs:time value: fn:get-seconds-from-time( $srcval as xs:time?) as xs:decimal? The returned value is an xs:decimal value between 0 and 60.999..., inclusive. For example, fn:get-seconds-from-time(xs:time("13:20:10.5")) returns 10.5. The fn:get-timezone-from-time FunctionThe fn:get-timezone-from-time function is the last of the date/time extraction functions, and it extracts the timezone from an xs:time value. Here's how you use it: fn:get-timezone-from-time( $srcval as xs:time?) as xdt:dayTimeDuration? When called, this function returns an xdt:dayTimeDuration value containing the timezone component of $srcval as an xdt:dayTimeDuration value. The returned value indicates the difference of the timezone of $srcval from UTC (this value may range from +14:00 to 14:00 hours, inclusive). For example, fn:get-timezone-from-time(xs:time("19:48:00-05:00")) returns an xdt:dayTimeDuration value of "-PT5H". |