Subject: RE: [xsl] Re: XSLT 2.0: On xsl:sequence and xsl:copy-of From: "Michael Kay" <mhk@xxxxxxxxx> Date: Mon, 13 Oct 2003 13:54:12 +0100 |
> > > > Yes, or at least partly. If you have an 'as' attribute on > > <xsl:variable> then it indicates the static type of the > variable, but > > the variable itself can be of a more specific type. > > > Roughly (not using DC speak), the 'as' attribute is the one I > want, even if the contents (of xsl:variable in this example) > might vary? "as" on xsl:variable is an assertion about the type. For example, if you do <xsl:variable name="x" as="xs:integer" select="my:prime-number()"/> then you are asserting that the function my:prime-number() will return an integer, or a value that can be (loosely-speaking) treated as an integer. If it returns an xs:unsignedInteger, your assertion is correct, because xs:unsignedInteger is a subtype of xs:integer. If it returns an attribute node that contains an integer, or that contains an untyped value that can be read as an integer, then you're also OK. But if the function returns a string or a date, then you'll get an error. The system can report this error at compile time if it can detect it then, otherwise it will be a run-time error. With a simpler case such as <xsl:variable name="x" as="xs:integer" select="'Bangkok'"/> one would hope that most systems will report the error at compile time, but the rules don't require this. (This is because we haven't tried to define the concept of a "constant expression"). > > > > > > > Similarly, if you have: > > > > <xsl:variable name="foo" as="xs:decimal" select="2" /> > > > > then the static type is a xs:decimal but the type of the variable's > > value is a xs:integer. > > ?? Dynamic is integer, static is decimal?? > > Assuming such a cast is viable/allowed, any use of $foo > will be as a decimal thereafter in the stylesheet? You don't get casting here, only the weaker kind of conversion allowed in function call and assignment contexts. This allows (a) extraction of the content of a node, (b) numeric promotion (e.g. integer to decimal, but not decimal to integer), and (c) casting of untyped values only. The static type of $foo is xs:decimal, but the dynamic type of its value is integer. Static types aren't likely to affect XSLT processors significantly; they are much more important for some XQuery processors (such as Microsoft's) which are proposing to implement "conservative" static typing: which means the static type of an expression has to be right for the context where it is used, not just the dynamic type of its value. This might sound complicated but it's exactly what happens in many programming languages like Java: it's an error to write Node n = xyz.getElement(); abc.setElement(n); if setElement expects an Element; you have to write abc.setElement((Element)n); This kind of cast is written "treat as" in XPath/XQuery (because SQL uses "cast" to mean something different). > > > > As long as the dynamic type (the type of the value that the > variable > > gets set to) is a subset of the static type (the type of > the variable > > as declared by the 'as' attribute), you're OK. > > 'Can be cast to' I guess. > No: this is nothing to do with casting. You can cast a string to a date, but you can't use a string in places where a date is expected. Michael Kay XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Re: XSLT 2.0: On xsl:sequ, Jeni Tennison | Thread | RE: [xsl] Re: XSLT 2.0: On xsl:sequ, David . Pawson |
RE: [xsl] match text node, Jim Fuller | Date | [xsl] RE: [xsl] RE: [xsl] RE: [xsl], Kaine Varley |
Month |