RE: [xsl] template match on attribute, copy but change value

Subject: RE: [xsl] template match on attribute, copy but change value
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Fri, 11 Jul 2003 09:46:19 +0100
> Section 7.5 of the Rec says:
> When the current node is an attribute, then if it would be an 
> error to use 
> xsl:attribute to create an attribute with the same name as 
> the current node, 
> then it is also an error to use xsl:copy (see [7.1.3 Creating 
> Attributes 
> with xsl:attribute]).
> 
> I took this to mean that xsl:copy won't work just as using 
> xsl:attribute 
> with the same name as the current node...

On the contrary, it is saying that if the the current node is an
attribute called X, then <xsl:copy/> does exactly the same as
<xsl:attribute name="X"><xsl:value-of select="."/></xsl:attribute>, and
that if <xsl:attribute name="X">... would cause an error, then
<xsl:copy/> will cause an error too.

But you are on the right lines. xsl:copy should be used only for making
an exact copy of an attribute. If you want to change anything (e.g. the
name or the value) then you should use
xsl:attribute to create a new attribute instead.

Michael Kay



however, the below 
> template works 
> (replacing same template from my previous post).  When 
> xsl:copy didn't work 
> and I found that definition I didn't initially test this 
> approach...my gut 
> told me to try it anyways after looking around...
> 
>   <xsl:template match="@myAtt">
>     <xsl:attribute name="myAtt">
>       <xsl:value-of select="'hi there'"/>
>     </xsl:attribute>
>   </xsl:template>
> 
> 
> Well, I guess I'm on my way, but if anybody has comments as to this 
> approach, I would more than welcome them.
> 
> Thanks,
>   Benjamin
> 
> >From: "Benjamin Farrow" <lovinjess@xxxxxxxxxxx>
> >Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >Subject: [xsl] template match on attribute, copy but change value
> >Date: Thu, 10 Jul 2003 15:51:08 -0700
> >
> >Hi,
> >  I'm attempting to find a single attribute and change it's value.  I
> >thought this should be simple, but it just doesn't seem to 
> be working.  
> >Looking at the Rec it says that xsl:copy is not allowed to copy the 
> >attribute and change it's value (what it looks like in the 
> archives that I 
> >found as well).  So my question is, can I use the identity 
> transform, then 
> >have a template matching a specific attribute and copy the 
> attribute to the 
> >result, but change it's value?
> >
> >XML File:
> ><test>
> >  <Element myAtt="test">
> >    <child/>
> >  </Element>
> ></test>
> >
> >
> >XSL File:
> ><xsl:stylesheet version="1.0"
> >xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> >
> >  <xsl:template match="/">
> >    <xsl:apply-templates select="*"/>
> >  </xsl:template>
> >
> >  <xsl:template match="@myAtt">
> >    <xsl:copy> <!-- this is ignored and will not let me change the 
> > value
> >-->
> >    <xsl:value-of select="'hi there'"/>
> >    </xsl:copy>
> >  </xsl:template>
> >
> >  <xsl:template match="node()|@*">
> >    <xsl:copy>
> >      <xsl:apply-templates select="node()|@*"/>
> >    </xsl:copy>
> >  </xsl:template>
> >
> ></xsl:stylesheet>
> >
> >Expected Output:
> ><test>
> >  <Element myAtt="hi there">
> >    <child/>
> >  </Element>
> ></test>
> >
> >
> >Thanks for any comments,
> >  Benjamin
> >
> >_________________________________________________________________
> >The new MSN 8: smart spam protection and 2 months FREE*
> >http://join.msn.com/?page=features/junkmail
> >
> >
> >XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> >
> 
> _________________________________________________________________
> Add photos to your messages with MSN 8. Get 2 months FREE*.  
> http://join.msn.com/?page=features/featuredemail
> 
> 
>  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