xsl-list
[Top] [All Lists]

RE: template match on attribute, copy but change value

2003-07-11 01:46:19
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(_at_)hotmail(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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



<Prev in Thread] Current Thread [Next in Thread>