Re: [xsl] Using @validation and @type?

Subject: Re: [xsl] Using @validation and @type?
From: "David Birnbaum djbpitt@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 27 Nov 2019 01:12:58 -0000
Dear Michael (cc XSL-list)

Thank you for this very helpful response. I realize now that I had failed
to understand (that is, I had partially confused) the role of @validation
vs @default-validation. And although I should have been attentive to the
difference between the type of the item (@row is an attribute) and the type
of its value, I wasn't thinking about the situation correctly. I
implemented your suggestions and everything is now working as advertised.

Sincerely,

David

On Tue, Nov 26, 2019 at 12:26 AM Michael Kay mike@xxxxxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> Firstly, it's important to remember that (conceptually at least) tree
> construction is bottom up. You successfully create an an attribute typed as
> attribute(*, xs:integer); then you create a <cell> element, and attach a
> copy of the attribute to this element; then you create a <test> element,
> and attach a copy of the <cell> element to this.
>
> There is no validation attribute on the <cell> element, and no containing
> element with a default-validation attribute, so the effect is as if you
> specified validation="strip", which drops the type annotation on the
> attribute when it is copied. To prevent this, I would suggest specifying
>
> <xsl:variable name="test" default-validation="preserve"/>
>
> which then also means you don't need the validation attribute on the
> <test> element.
>
> What you've got here is a sort of degenerate form of schema-aware
> processing in which your schema only contains the built-in types. I haven't
> tried doing that myself but it should work in theory.
>
> Note also, (@row instance of xs:integer) is always going to be false: @row
> is an attribute node, not an integer. What you want here is either
> (data(@row) instance of xs:integer), or (@row instance of attribute(*,
> xs:integer)).
>
> Michael Kay
> Saxonica
>
> On 26 Nov 2019, at 01:38, David Birnbaum djbpitt@xxxxxxxxx <
> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Dear XSL-list,
>
> I'm beginning to explore schema-aware processing, and for a real project I
> need to create some temporary elements with attributes that I would like to
> treat as integers. In the non-schema-aware version I explicitly pass the
> attributes through the number() function when I need integer behavior, and
> that does what I want, but I thought that if I typed the values as
> xs:integer when creating them they would be recognized as instances of that
> type when used, and would have integer behavior, so that I could
> avoid using the number() function explicitly.
>
> I created a small test sample below that replicates the problem I see in
> my real code, and I would be grateful if someone could please advise about
> what I've misunderstood. What I think I'm doing is creating a a variable
> that contains <cell> elements with @row attributes that are typed as
> xs:integer, and that therefore should behave as integers when I use them.
> But when I test in the <xsl:for-each> at the end whether they are instances
> of integers, the system reports that they are not. I'm running the tests at
> the command line with Saxon EE and the -sa and -it switches. Thank you for
> any guidance you might be able to provide.
>
> Best,
>
> David
> __
>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>     xmlns:xs="http://www.w3.org/2001/XMLSchema";
> exclude-result-prefixes="xs" version="3.0">
>     <xsl:output method="xml" indent="yes"/>
>     <xsl:template name="xsl:initial-template">
>         <xsl:variable name="test" as="element(test)">
>             <test xsl:validation="preserve">
>                 <xsl:for-each select="1 to 5">
>                     <cell>
>                         <xsl:attribute name="row" type="xs:integer"
> select="."/>
>                         <xsl:text>Hi!</xsl:text>
>                     </cell>
>                 </xsl:for-each>
>             </test>
>         </xsl:variable>
>         <xsl:for-each select="$test//cell">
>             <xsl:message select="@row, @row instance of xs:integer"/>
>         </xsl:for-each>
>         <root>
>             <xsl:sequence select="$test"/>
>         </root>
>     </xsl:template>
> </xsl:stylesheet>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by
> email)
>
>
> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/3318727> (by
> email <>)

Current Thread