Subject: Re: 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
|