<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:ex="java:/org.fgeorges.exslt2.saxon.Exslt2InstructionFactory"
               xmlns:ef="http://www.fgeorges.org/exslt2"
               xmlns:curr="java:org.fgeorges.exslt2.saxon.CurrentError"
               exclude-result-prefixes="curr ef xs"
               version="2.0">

  <xsl:function name="ef:current-error" as="xs:QName">
    <xsl:variable name="if-null" select="
        'ef:current-error() must be used in the scope of an ex:catch!'"/>
    <xsl:variable name="current" select="curr:current()"/>
    <xsl:sequence select="
        if ( empty($current) ) then
          error(xs:QName('ex:EX2ES0003'), $if-null)
        else
          QName(curr:getUri($current),
                if ( curr:getPrefix($current) ) then
                  concat(curr:getPrefix($current), ':', curr:getLocal($current))
                else
                  curr:getLocal($current))"/>
  </xsl:function>

  <xsl:function name="ef:current-error-message" as="xs:string?">
    <xsl:variable name="if-null" select="
        'ef:current-error-message() must be used in the scope of an ex:catch!'"/>
    <xsl:variable name="current" select="curr:current()"/>
    <xsl:sequence select="
        if ( empty($current) ) then
          error(xs:QName('ex:EX2ES0003'), $if-null)
        else
          curr:getMessage($current)"/>
  </xsl:function>

  <xsl:function name="ef:current-error-trace" as="xs:string?">
    <xsl:variable name="if-null" select="
        'ef:current-error-trace() must be used in the scope of an ex:catch!'"/>
    <xsl:variable name="current" select="curr:current()"/>
    <xsl:sequence select="
        if ( empty($current) ) then
          error(xs:QName('ex:EX2ES0003'), $if-null)
        else
          curr:getStackTrace($current)"/>
  </xsl:function>

  <xsl:function name="ef:current-error-clark" as="xs:string">
    <xsl:variable name="error" select="ef:current-error()"/>
    <xsl:sequence select="
        concat('{', namespace-uri-from-QName($error), '}', local-name-from-QName($error))"/>
  </xsl:function>

</xsl:transform>
