RE: [xsl] recreating elements with attributes

Subject: RE: [xsl] recreating elements with attributes
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Wed, 11 Feb 2004 11:41:55 -0500
Hi Terry,

At 07:42 PM 2/10/2004, you wrote:
<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>

This would be expressed more idiomatically as follows:


<xsl:template match="CDRS/TOLL_CDR">
  <TOLL_CDR>
    <xsl:apply-templates select="@*">
  </TOLL_CDR>
</xsl:template>

<xsl:template match="TOLL_CDR/@DIVISION" priority="2">
  <xsl:attribute name="mydivision">
    <xsl:value-of select="." />
  </xsl:attribute>
</xsl:template>

<xsl:template match="TOLL_CDR/@*">
  <xsl:copy-of select="."/>
</xsl:template>


In this case the priority is needed on the template matching the @DIVISION attribute since both it and the template matching "TOLL_CDR/@*" (i.e., all attributes on TOLL_CDR) have the same default priority (a priority of 1). Since the first template, but not the second, matches the attribute whose name you want to change, giving it a higher priority ensures that it will match when it can, whereas the other attributes on TOLL_CDR will only match the second template.


(The matches on the latter two templates might as well be "@DIVISION" and "@*", in which case you wouldn't need to set the priority since "@DIVISION" has a default priority of 0.5, while "@*" has a priority of 0. But in this case they would also match attributes on other elements; whether this is a good thing depends on what the rest of your transformation is doing.)

There are other ways of doing this too, offering different tradeoffs of conciseness, flexibility and extensibility; this particular approach, however, may help shed light on XSLT's funky and powerful node-manipulation processing model.

Cheers,
Wendell



======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================


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



Current Thread