Re: [xsl] Process some elements, but not others...

Subject: Re: [xsl] Process some elements, but not others...
From: Mike Brown <mike@xxxxxxxx>
Date: Thu, 13 Feb 2003 20:25:31 -0700 (MST)
Ted Stresen-Reuter wrote:
> I have an xml document whose elements contain html as in the following 
> example:
> 
> <myelement>
>      <p>This is <ref>the</ref> text node</p>
> </myelement>
> 
> What I'd like to be able to do is transform just the ref element and 
> copy all the others.

This is more or less in the XSLT 1.0 spec, under Copying.

The "identity transform" described there is a template that has a relatively
low priority and recursively copies all nodes from the source tree to the
result. If you supplement that template with another that, by virtue of 
matching with a more specific node test than the other, has a higher priority, 
then you can override the identity transform for certain elements:

<!-- identity transform -->
<xsl:template match="@*node()">
  <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>

<!-- replace a ref element with its children -->
<xsl:template match="ref">
  <xsl:apply-templates/>
</xsl:template>


Also, just FYI, your source tree has a structure like this:

root
 |
 |__element 'myelement'
      |
      |__text '\n     '
      |
      |__element 'p'
      |    |
      |    |__text 'This is '
      |    |
      |    |__element 'ref'
      |    |    |
      |    |    |__text 'the'
      |    |
      |    |__text ' text node'
      |
      |__text '\n'

...that is, "This is the text node" is not very accurate; the phrase is split
among 3 different text nodes, although if you use the templates above, you'll
end up with one :)

Mike

-- 
  Mike J. Brown   |  http://skew.org/~mike/resume/
  Denver, CO, USA |  http://skew.org/xml/

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread