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

Subject: Re: [xsl] copy attributes modifying their values, regardless of their names
From: TW <zupftom@xxxxxxxxxxxxxx>
Date: Sat, 4 Dec 2010 21:00:54 +0100
Yay, that's of course it!  I feel relieved and embarrassed at the same
time.  I thought attribute value templates were only possible in
literal result elements.

Thanks a lot!
Thomas W.


2010/12/4 Emmanuel Bigui <eb@xxxxxxxxxx>:
> 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@xxxxxxxxxxxxxx> 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.

Current Thread