Subject: Re: xsl:apply-templates to all but...
From: andrew welch <andrew.j.welch@xxxxxxxxx>
Date: Fri, 17 Feb 2006 13:59:51 +0000
|
On 2/17/06, Bob DuCharme <bob@xxxxxxxx> wrote:
> xsl:apply-templates to all but...
>
> I was curious about opinions on a processing trick I've been doing lately.
> The issue: if element w has content model (x,y,z) and I want to output its
> contents in (y,z,x) order, I could do this:
>
> <xsl:template match="w">
> <xsl:apply-templates select"y"/>
> <xsl:apply-templates select"z"/>
> <xsl:apply-templates select"x"/>
> </xsl:template>
>
> But if something later gets added to that content model, this template
> rule will ignore it. If @select could take a regular expression more
> complex than * or ns:*, that would be cool, but that's not an option. So
> here's what I've done:
>
> <xsl:template match="w">
> <xsl:apply-templates select"y" mode="output"/>
> <xsl:apply-templates select"*"/>
> </xsl:template>
>
> <xsl:template match="y" mode="output">
> <!-- process normally -->
> </xsl:template>
>
> <xsl:template match="y"/>
>
> x and z get processed normally. (In real life, this was with larger, more
> complex content models and template rules.)
>
> Has anyone else done this? Or something similar, and if different, how so?
But the output here would be Y X Z not Y Z X....... have you let out
the X matching templates which would mirror the Y matching templates?
Even so, couldn't you just do:
<xsl:template match="w">
<xsl:apply-templates select="y"/>
<xsl:apply-templates select="z"/>
<xsl:apply-templates select="*[not(self::y)][not(self::z)]"/>
</xsl:template>
|