RE: [xsl] recreating elements with attributes

Subject: RE: [xsl] recreating elements with attributes
From: "Gruenewald, Terry" <tgruenewald@xxxxxxxxxx>
Date: Tue, 10 Feb 2004 18:42:11 -0600
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@xxxxxxxx]
Sent: Tuesday, February 10, 2004 5:45 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
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 &lt; and &gt;, but the transformation process just then
> litterally puts in &lt; and &gt;.
> 
> 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


Current Thread