xsl-list
[Top] [All Lists]

RE: [xsl] reading a document into a typed variable

2009-10-02 04:34:24
I don't understand the difference between two ways of loading 
an XML file into a variable (see A and B below). Case A used 
to work with old saxon 8.9, but with 9.2 only B is 
successful. With A I get following error message:

  XTTE0570: Required item type of value of variable $global.setup is
  document-node(element(global-setup, xs:anyType)); supplied 
value has item type xs:string

Saxon's type checking has improved between the two releases. Saxon 9.2
recognizes at compile time that if $global.setup.file is a string, then
trace($global-setup-file, x) will also be a string, and that this is
inconsistent with your declared type, which is document-node(). In earlier
releases this error would only have been detected at run-time, and only if
this branch of the if-then-else were selected. But Saxon's static
type-checking is not yet perfect: it seems it is failing to spot that if
trace($global-setup-file, x) is a string, then <xsl:copy-of
select="trace($global-setup-file, x)"/> will also be a string, and this is
why you get no compile-time error message for case B. I'll take a look at
this and try to improve it for the next release.

What you really want is to remove the error, of course, and to do that you
need to ensure that the exception branch of your conditional delivers a
result that is consistent with the type declaration of the variable.

Regards,

Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay 


If I omit the type declaration in A, the rest of the 
stylesheet is nevertheless working correctly. So at a certain 
stage, what saxon sees as a xs:sting is converted into a tree.

It's OK with me if you just point me to the right 
documentation to find out myself.

Thanks for clarification,
Georges

[A]
<xsl:param name="global.setup.file" 
select="'../../xml-resolved/GlobalSetup-resolved.xml'" 
as="xs:string"/> <xsl:variable name="global.setup" select="if
(doc-available($global.setup.file))
                                          then
document($global.setup.file)
                                          else 
trace($global.setup.file,'Configuration File $global.setup.file was 
not readable (missing or not valid)!')"
as="document-node(element(global-setup))"/>

[B]

<xsl:variable name="global.setup" 
as="document-node(element(global-setup))">
  <xsl:choose>
    <xsl:when test="doc-available($global.setup.file)">
      <xsl:copy-of select="document($global.setup.file)"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy-of select="trace($global.setup.file,'Configuration
File $global.setup.file was not readable (missing or not 
valid)!')"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>
**************************************************************
********************************
IMPORTANT NOTICE / WICHTIGER HINWEIS
This communication contains information which is confidential 
and may also be privileged. It is for the exclusive use of 
the intended recipient(s). If you are not the intended 
recipient(s) please note that any distribution, copying or 
use of this communication or the information in it is 
strictly prohibited. If you have received this communication 
in error please notify us immediately by email or by 
telephone and then delete this email and any copies of it.
Diese E-Mail koennte vertrauliche und/oder rechtlich 
geschuetzte Informationen enthalten. Wenn Sie nicht der 
richtige Adressat sind oder diese E-Mail irrtuemlich erhalten 
haben, informieren Sie bitte sofort den Absender und 
vernichten Sie diese Mail. Das unerlaubte Kopieren sowie die 
unbefugte Weitergabe dieser Mail sind nicht gestattet.

HEITEC AG, Werner-von-Siemens-Str. 61, 91052 Erlangen, HRB 
7754, RG Fuerth, Vorstandsvorsitzender: 
Richard Heindl, Vorstand: Harald Preiml, Finanzvorstand: 
Rene-Oliver Rosner, Aufsichtsratsvorsitzender: Dr. 
Lorenz M. Raith, WWW: http://www.heitec.de


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>