Max Toro
Max Toro

Reputation: 28618

Dynamic cast in XSLT 2.0 or 3.0

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?

Upvotes: 1

Views: 280

Answers (1)

Michael Kay
Michael Kay

Reputation: 163595

In XPath 3.0 you can do

let $constructor := function-lookup(
     QName("http://www.w3.org/2001/XMLSchema", $local-name), 1)
return $constructor($val)

Upvotes: 4

Related Questions