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

Subject: [xsl] Template-matching nodes from input vs nodes in variable based on their position
From: "Jorge . chocolate.camera@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 17 Jun 2015 18:55:22 -0000
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?

Current Thread