1

I have this code to cast a string to a type determined at runtime:

<xsl:variable name="typed-val" select="
    if ($local-name eq 'integer') then $val cast as xs:integer
    else if ($local-name eq 'decimal') then $val cast as xs:decimal
    else if ($local-name eq 'double') then $val cast as xs:double
    else if ($local-name eq 'float') then $val cast as xs:float
    else if ($local-name eq 'date') then $val cast as xs:date
    else if ($local-name eq 'time') then $val cast as xs:time
    else if ($local-name eq 'dateTime') then $val cast as xs:dateTime
    else if ($local-name eq 'duration') then $val cast as xs:duration
    else if ($local-name eq 'string') then $val cast as xs:string
    else if ($local-name eq 'boolean') then $val cast as xs:boolean
    else if ($local-name eq 'anyURI') then $val cast as xs:anyURI
    else if ($local-name eq 'QName') then resolve-QName($val, $context)
    else if ($local-name eq 'gDay') then $val cast as xs:gDay
    else if ($local-name eq 'gMonthDay') then $val cast as xs:gMonthDay
    else if ($local-name eq 'gMonth') then $val cast as xs:gMonth
    else if ($local-name eq 'gYearMonth') then $val cast as xs:gYearMonth
    else if ($local-name eq 'gYear') then $val cast as xs:gYear
    else if ($local-name eq 'yearMonthDuration') then $val cast as xs:yearMonthDuration
    else if ($local-name eq 'dayTimeDuration') then $val cast as xs:dayTimeDuration
    else if ($local-name eq 'base64Binary') then $val cast as xs:base64Binary
    else if ($local-name eq 'hexBinary') then $val cast as xs:hexBinary
    else ()
"/>

Is there a better way to do this in XSLT 2.0? how about in 3.0?

Max Toro
  • 28,282
  • 11
  • 76
  • 114

1 Answers1

4

In XPath 3.0 you can do

let $constructor := function-lookup(
     QName("http://www.w3.org/2001/XMLSchema", $local-name), 1)
return $constructor($val)
Michael Kay
  • 156,231
  • 11
  • 92
  • 164