This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Identity transformation (without using xsl:copy)
- From: "Sullivan, Dan" <dsullivan at develop dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Sun, 31 Mar 2002 09:15:38 -0800
- Subject: RE: [xsl] Identity transformation (without using xsl:copy)
- Reply-to: xsl-list at lists dot mulberrytech dot com
These two xslt files do what I think you want:
file: identity.xslt
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
file: identEleToUpper.xslt
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="identity.xslt"/>
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*" >
<xsl:element name="{translate(local-name(),
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ')}"
namespace="{namespace-uri()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
You could put the identity transform in identToUpper by setting the priority of the match="*" template.
Dan
-----Original Message-----
From: Roger L. Costello [mailto:costello@mitre.org]
Sent: Sunday, March 31, 2002 11:03 AM
To: xsl-list@lists.mulberrytech.com; costello@mitre.org
Subject: Re: [xsl] Identity transformation (without using xsl:copy)
A few weeks ago I posted a message (below) asking how to do an identity
transformation (without using <xsl:copy>) on instance documents that
contain namespace declarations. The resounding response was "no way".
[Thanks for your input!] Okay, after much testing and reading I have
convinced myself that you are correct - <xsl:copy> must be used. It
seems to me that this puts some serious limits on XSLT. Consider this
simple problem: write a stylesheet which does an identity
transformation, but where all element (local) names are converted to
upper case. For example:
If this is the start document:
<?xml version="1.0"?>
<j:juicers xmlns:j="http://www.juicers.org">
<j:juicer id="omega">
<name xmlns="http://www.names.org">
Mighty Omega Juicer
</name>
</j:juicer>
</j:juicers>
Then this should be the result document:
<?xml version="1.0"?>
<j:JUICERS xmlns:j="http://www.juicers.org">
<j:JUICER id="omega">
<NAME xmlns="http://www.names.org">
Mighty Omega Juicer
</NAME>
</j:JUICER>
</j:JUICERS>
If I could use <xsl:element> then I could easily accomplish this
transformation. However, it escapes me how to do it if I am forced to
use <xsl:copy>.
The more general question is: if I use <xsl:copy> to copy over an input
tree to an output tree how can I make modifications to elements names
(such as converting the local part to upper case, as shown above), and
modifications to each element's (non-namespace declaration) attributes?
Thanks! /Roger
"Roger L. Costello" wrote:
>
> Does anyone have a stylesheet which does an identity transformation
> without using xsl:copy? The below stylesheet works fine provided the
> instance document does not use namespaces, e.g., it does not copy over
> the namespace declarations, and it results in an error being generated
> when an element is encountered that is explicitly namespace-qualified.
> Could someone show me how to enhance this to deal properly with
> namespaces? Thanks! /Roger
>
> identity.xsl
>
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="1.0">
>
> <xsl:output method="xml"/>
>
> <xsl:template match="*">
> <xsl:element name="{name(.)}">
> <xsl:for-each select="@*">
> <xsl:attribute name="{name(.)}">
> <xsl:value-of select="."/>
> </xsl:attribute>
> </xsl:for-each>
> <xsl:apply-templates/>
> </xsl:element>
> </xsl:template>
>
> </xsl:stylesheet>
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list