Alternative approach: donbt use position().
<xsl:function name=bmy:indexb as=bxs:integer*b>
<xsl:param name=bsequenceb as=bnode()*b/>
<xsl:param name=bnodeb as=bnode()b/>
<xsl:sequence select=bfor $i in 1 to count($sequence) return if
($sequence[$i] is $node) then $i else ()b/>
</xsl:function>
<xsl:template match=bpage[my:index($FOO, .)] = (1, 3, 5)]b>
b&
</xsl:template>
Michael Kay
Saxonica
> On 17 Jun 2015, at 19:55, Jorge . chocolate.camera@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> 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?
| Current Thread |
|
Michael Kay mike@xxxxxxxxxxxx - 18 Jun 2015 09:39:36 -0000 <=
|
|