[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] xsl:apply-templates to all but...


Subject: Re: [xsl] 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>


Current Thread