Re: [xsl] How to store a sequence into an element ... and maintainthe sequence inside the element?

Subject: Re: [xsl] How to store a sequence into an element ... and maintainthe sequence inside the element?
From: "Dr. Roger L Costello costello@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sun, 19 Jul 2020 20:52:21 -0000
Thank you Martin. Is there no other way to preserve a sequence than to resort
to connecting the XSLT to an XML Schema?

In my actual application I am creating many sequences. I need an efficient way
of storing the sequences. For example, initially $list might be (1, 2, 3) and
then processing results in updating $list to (4, 1, 5) and then to (9, 9, 0)
and then to (4, 1, 4) and then to ...

What is your recommendation for managing sequences?

/Roger

-----Original Message-----
From: Martin Honnen martin.honnen@xxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Sunday, July 19, 2020 3:57 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [EXT] Re: [xsl] How to store a sequence into an element ... and
maintainthe sequence inside the element?

On 19.07.2020 21:14, Dr. Roger L Costello costello@xxxxxxxxx wrote:
> Hi Folks,
>
> I created a sequence (1, 2, 3) as follows:
>
> <xsl:variable name="list" select="(1, 2, 3)" as="xs:integer*" />
>
> I checked that $list contains 3 integers:
>
> <xsl:message>count($list) = <xsl:value-of
select="count($list)"/></xsl:message>
>
> Sure enough, the output shows that there are 3 items:
>
> count($list) = 3
>
> Next, I want to store that sequence of integers in an element, along with
other elements:
>
> <xsl:variable name="document" as="element(Document)">
>      <Document>
>          <Greeting>My List</Greeting>
>          <List><xsl:sequence select="$list" /></List>
>          <Ending>The End</Ending>
>      </Document>
> </xsl:variable>
>
> Does the <List> element contain a sequence of 3 integers:
>
> <xsl:message>count($document/List) = <xsl:value-of
select="count($document/List)"/></xsl:message>
>
> Yikes! No it doesn't:
>
> count($document/List) = 1
>
> How to do what I want to do? That is, how to store the sequence of integers
in an element, along with other elements, such that I can pull the sequence
out of the element and immediately operate on the sequence? If that can't be
done, then what's the right way to do what I want to do?

That expression will always return the number of "List" elements. If you
use a schema and give that element a list datatype then I think that
with schema-aware processing
   $document/List/data()
would give you a list and you could of course count that list with e.g.
   count($document/List/data())


So the simplest example would be

     <xsl:import-schema>
         <xs:schema>
             <xs:element name="List" type="int-list"/>
             <xs:simpleType name="int-list">
                 <xs:list itemType="xs:integer"/>
             </xs:simpleType>
         </xs:schema>
     </xsl:import-schema>

     <xsl:template match="/" name="xsl:initial-template">
         <xsl:variable name="list" select="(1, 2, 3)" as="xs:integer*" />
         <xsl:message>count($list) = <xsl:value-of
select="count($list)"/></xsl:message>
         <xsl:variable name="list-element" as="schema-element(List)">
             <List xsl:validation="strict">
               <xsl:sequence select="$list"/>
             </List>
         </xsl:variable>
         <xsl:message>count($list-element) = <xsl:value-of
select="count($list-element)"/></xsl:message>
         <xsl:message>count($list-element/data()) = <xsl:value-of
select="count($list-element/data())"/></xsl:message>
         <xsl:message select="$list-element instance of
schema-element(List)"/>
     </xsl:template>

you would need to write a more complex schema for the more complex
sample you had I think, I am not sure whether you could use a schema
type for that element inside other untyped elements.

Current Thread