Re: [xsl] Template-matching nodes from input vs nodes in variable based on their position

Subject: Re: [xsl] Template-matching nodes from input vs nodes in variable based on their position
From: "Martin Honnen martin.honnen@xxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 17 Jun 2015 19:02:34 -0000
Jorge . chocolate.camera@xxxxxxxxx wrote:
I am puzzled by this. I cannot template-match elements based on their
position when they are stored in a variable while I can successfully
do so when they come from the input XML document.

This is the input XML document:

     <?xml version="1.0" encoding="UTF-8"?>
     <pages>
         <page>Page number 1</page>
         <page>Page number 2</page>
         <page>Page number 3</page>
         <page>Page number 4</page>
         <page>Page number 5</page>
         <page>Page number 6</page>
         <page>Page number 7</page>
     </pages>

In the stylesheet below I define a global variable $FOO that contains
a subtree of elements identical to the input XML (sans root element).
Then I try to do an identity copy of both the input and the variable,
but also add an attribute to elements of certain positions.

This is the stylesheet:

     <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet version="2.0"
                     xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

         <xsl:variable name="FOO" as="node()+">
             <page>Page number 1</page>
             <page>Page number 2</page>
             <page>Page number 3</page>
             <page>Page number 4</page>
             <page>Page number 5</page>
             <page>Page number 6</page>
             <page>Page number 7</page>
         </xsl:variable>

         <xsl:template match="pages">
             <pages>
                 <!-- Copy input subtree -->
                 <from-input>
                     <xsl:apply-templates select="@*|node()"/>
                 </from-input>

                 <!-- Copy variable subtree -->
                 <from-variable>
                     <xsl:apply-templates select="$FOO"/>
                 </from-variable>
             </pages>
         </xsl:template>

         <!-- Indentity copy -->
         <xsl:template match="@*|node()">
             <xsl:copy>
                 <xsl:apply-templates select="@*|node()"/>
             </xsl:copy>
         </xsl:template>

         <!-- Add attribute to elements of certain positions -->
         <xsl:template match="page[position() = (1,3,5)]">
             <xsl:copy>
                 <xsl:attribute name="foo"/>
                 <xsl:apply-templates select="@*|node()"/>
             </xsl:copy>
         </xsl:template>

</xsl:stylesheet>

As you can see in the output below, only elements from the input
document are matched, but not elements from the variable.

     <?xml version="1.0" encoding="UTF-8"?>
     <pages>
         <from-input>
             <page foo="">Page number 1</page>
             <page>Page number 2</page>
             <page foo="">Page number 3</page>
             <page>Page number 4</page>
             <page foo="">Page number 5</page>
             <page>Page number 6</page>
             <page>Page number 7</page>
         </from-input>
         <from-variable>
             <page>Page number 1</page>
             <page>Page number 2</page>
             <page>Page number 3</page>
             <page>Page number 4</page>
             <page>Page number 5</page>
             <page>Page number 6</page>
             <page>Page number 7</page>
         </from-variable>
     </pages>

Why?

It is a sequence of elements, try to remove the 'as="node()+"' from the variable and then use
<xsl:apply-templates select="$FOO/*"/>


Current Thread