xsl-list
[Top] [All Lists]

Re: [xsl] copy attributes modifying their values, regardless of their names

2010-12-04 02:30:13
Hi,

Wouldn't this work:

<xsl:template match="*">
        <xsl:copy>
                <xsl:for-each select="@*">
                        <xsl:attribute name="{name()}">
                                <xsl:call-template name="modify"/>
                                </xsl:attribute>
                        </xsl:for-each>
                <xsl:apply-templates/>
                </xsl:copy>
        </xsl:template>

...?
Regards,
EB


On Sat, Dec 4, 2010 at 8:45 AM, TW <zupftom(_at_)googlemail(_dot_)com> wrote:
Hi all,

I'm generating XSL stylesheets using XSL.  One thing I want to do is
modify all attribute value templates found in the source document.  I
thought something like this would do the job:

<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform";>
 <template name="modify-attribute-value-templates">
   Create replacement value
 </template>

 <template match="*">
   <copy>
     <for-each select="@*">
       <copy>
         <call-template name="modify-attribute-value-templates"/>
       </copy>
     </for-each>
     <apply-templates/>
   </copy>
 </template>
</stylesheet>

But much to my chagrin I realized that <copy> already copies the value
if applied to attributes.  A workaround could be a long choose element
like this:

 <template match="*">
   <copy>
     <for-each select="@*">
       <choose>
         <when test="not(contains(string(),'{'))">
           <copy/>
         </when>
         <when test="local-name()='att1'">
           <attribute name="att1">
             <call-template name="modify-attribute-value-templates"/>
           </attribute>
         </when>
         <when test="local-name()='att2'">
           <attribute name="att2">
             <call-template name="modify-attribute-value-templates"/>
           </attribute>
         </when>
         <!-- a ton of more attributes -->
         <otherwise>
           <message terminate="yes">
             The attribute value template found in attribute
             <value-of select="local-name()"/>
             isn't handled by the stylesheet.
           </message>
         </otherwise>
       </choose>
     </for-each>
     <apply-templates/>
   </copy>
 </template>

There might be an awful lot of attributes that have to be handled.  If
I don't know what attributes are to be found in the source document,
then I I'll have to add another step to the process, creating the
above choose statement using another stylesheet.

I refuse to believe that something I thought would be done in three
lines turns out to require thousands of lines for case differentiation
and potentially an additional step in the process.  Can anyone help?

Thomas W.

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--