RE: [xsl] Copy CDATA nodes from XML to XML format w/ XALAN

Subject: RE: [xsl] Copy CDATA nodes from XML to XML format w/ XALAN
From: "Michael Kay" <michael.h.kay@xxxxxxxxxxxx>
Date: Sun, 3 Mar 2002 22:27:58 -0000
> I'm dealing with a similar issue. I'm trying to implement
> a very simple compositional XSLT based query language.

No, this isn't similar at all, because all the information you need is
present in the XPath data model.
>
> My question is, is there a way to output tagged elements,
> ie. given the XML document:
>
> <data>
>   <test>aa</test>
> </data>
>
> I wish to apply XSLT to output
>
>   <test>aa</test>

Well, the simplest way is

<xsl:template match="data">
<xsl:copy-of select="child::node()"/>
</xsl:template>
>
> I'm interested in doing this because the content of the data
> element may be any XML document and I need to translate all
> newline characters of that into whitespaces. Eg. given
>
> <data>
>    <a>
>      <b>content</b>
>    </a>
> </data>
>
> I need to output
>
> <a><b>content</b></a>
>
> Any hints on how to accomplish this?

If the whitespace that you want to get rid of is all in separate text nodes
(i.e. it is not adjacent to non-whitespace text), simply add to the
stylesheet the top-level declaration

<xsl:strip-space elements="*"/>

If the changes you want to make are more subtle, you'll need to depart from
the <xsl:copy-of> approach, and instead do a recursive apply-templates all
down the tree. For example:

<xsl:template match="*">
  <xsl:copy>
  <xsl:copy-of select="@*"/>
  <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="text()">
  <xsl:value-of select="normalize-space(.)"/>
</xsl:template>

will achieve a rather more brutal pruning of whitespace if that's what you
want.

Michael Kay
Software AG
home: Michael.H.Kay@xxxxxxxxxxxx
work: Michael.Kay@xxxxxxxxxxxxxx


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


Current Thread