Thanks. Actually I needed to do more than just copy, I needed to change some
attributes as well. Your <xsl:attribute> hint gave me my answer:
<xsl:template match="CDRS/TOLL_CDR">
<TOLL_CDR>
<xsl:for-each select="@*">
<xsl:choose>
<xsl:when test="name()='DIVISION'">
<!-- do special logic here, such as rename an attribute -->
<xsl:attribute name="mydivision">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:copy/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</TOLL_CDR>
</xsl:template>
Thanks everyone who responded.
-----Original Message-----
From: J.Pietschmann [mailto:j3322ptm(_at_)yahoo(_dot_)de]
Sent: Tuesday, February 10, 2004 5:45 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] recreating elements with attributes
Gruenewald, Terry wrote:
I'm performing an XML to XML transformation and I need to make some
modifications to a few attributes during this transformation. I've tried the
following code, but I'm stuck as to how to print the "<" sign and ">" sign.
I've tried using the < and >, but the transformation process just then
litterally puts in < and >.
this code loops through all attributes for the TOLL_CDR node. The problem is
when I try and put "<TOLL_CDR" in there, because the parser yells about the
"<" sign in front of it. Any thoughts?
<xsl:template match="//CDRS/TOLL_CDR">
<TOLL_CDR
<xsl:text>
</xsl:text>
<xsl:for-each select="@*">
<xsl:value-of select="name()" />="<xsl:value-of select="." />"<xsl:text>
</xsl:text>
</xsl:for-each>
/>
</xsl:template>
Ouch.
XSLT is *not* a macro language, or whatever you expect. XSLT is a
language which describes a transformation from a source tree of
nodes into a result tree. The nodes in both trees represent mainly
XML elements, attributes and text.
You have really to get this: you *don't* create a string with angle
brackets. You create a result tree.
After this has sunken in, you might realize that you have to create
attributes in the result tree either with xsl:attribute or by copying
them from the source tree in an appropriate context. In your case,
you are basically looking for the generic copy template. Somewhat
more specific
<xsl:template match="CDRS/TOLL_CDR">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
It pays off to get one of the introductionary books about XSLT and
read the first few chapters, which should explain in detail what is
going on here.
J.Pietschmann
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list