Re: [xsl] Nicer way to change context-node than xsl:for-each ?

Subject: Re: [xsl] Nicer way to change context-node than xsl:for-each ?
From: Mukul Gandhi <gandhi.mukul@xxxxxxxxx>
Date: Sat, 5 Dec 2009 13:08:36 +0530
2009/12/4 FrC)dC)ric Schwebel <Fred.Schwebel@xxxxxxxxxxx>:
> <xsl:template match="foo">
> B <!-- do things with root -->
> B <xsl:for-each select="*[1]">
> B  B <xsl:value-of select="." />
> B  B <!-- do many other things, call templates... -->
> B </xsl:for-each>
> </xsl:template>
>
> Usually xsl:for-each is used to process a serie of nodes, not only to
> change the context.

It seems to me, xsl:for-each won't be required in this case. You only
want to process "one" element (*[1] implies that!).

Therefore, I could have written the stylesheet logic as follows:

<xsl:template match="foo">
 <xsl:variable name="x" select="*[1]" />
 <xsl:value-of select="$x" />
 <!-- can do other things, on "x" -->
</xsl:template>

If you are working in a 2.0 environment, there are also possibilities
for stronger compile time type checking, for example as below:

<xsl:variable name="x" select="*[1]" as="element()" />

It also seems, that *[1] will always imply an element, so
as="element()" may not be necessary, if you don't care if this element
should exist or not.

But certainly it's a good idea to specify data types of variables etc,
if we know before compilation (and most of the time, we do!), what the
data types should be.


--
Regards,
Mukul Gandhi

Current Thread