Re: [xsl] Moving nested elements to root level

Subject: Re: [xsl] Moving nested elements to root level
From: Kevin Rodgers <kevin.rodgers@xxxxxxx>
Date: Fri, 27 May 2005 10:36:37 -0600
jpk writes:
> I am in need of a transform that moves all instances
> of a given element to the root level.  So given the
> target element name is 'br' and this as input:
> 
> <p>
>   <strong>
>     strong:text(top) <br/>prefix
>       <span style="a style">
>         span a 
>         <span style="rgb();">
>           span b<br/> text
>         </span>
>         text
>        </span>
>     strong:text(btm) <br/>suffix<br/>
>   </strong>
>   Root level text with<br/> tag.
> </p>
> 
> 
> I want to get something like this:
> 
> <p>
>   <strong>
>     strong:text(top) 
>   </strong>
>   <br/>
...

Just a guess:

1. Use the identity transformation to copy everything by default:

<xsl:template name="identity" match="@*|node()" mode="#all">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

2. Write a template for the p target element that augments the identity
   transformation with its br descendants:

<xsl:template match="p">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()|*//br"/ mode="copy">
  </xsl:copy>
</xsl:template>

3. Plus a template to suppress the br elements in their original place
   in the tree:

<xsl:template match="br" mode="#default">
</xsl:template>

I added the mode attributes to the templates last, to try to distinguish
when the identity and suppress templates should be applied to the br
elements.

-- 
Kevin Rodgers

Current Thread