Re: [xsl] Copying an entire NodeSet with modified selected attribute values

Subject: Re: [xsl] Copying an entire NodeSet with modified selected attribute values
From: Klaus Berger <klberger@xxxxxxxxx>
Date: Thu, 23 Jun 2005 17:50:04 +0200
2005/6/23, michella@xxxxxxx <michella@xxxxxxx>:
> Hi all,
>
> A need a little help :
>
> Given SVG:
>
> <svg width="100%" height="100%" viewBox="-24 -21 1296 1135"
> preserveAspectRatio="xMinYMin meet" kerning="0" xml:space="preserve"
> xmlns:xlink="http://www.w3.org/1999/xlink"; style="stroke: black; fill:
> none;">
>        <g id="122" type="443" node="Yes">
>        ...
>        </g>
> </svg>
>
> I would like to keep/copy the entire SVG Structure, but just change
> specific attribute values.
>
> Example :clone it, except that : (...) height="NEWVALUE" (...)
>
> Could it be possible to simple use xsl:copy-of function with exceptions
> (IFs)?
>

I would suggest the following steps

1. Copy the element node
2. Copy all attributes
3. Replace existing attributes or add new ones
4. Copy child nodes or apply templates to child nodes

<xsl:template match="svg">
    <!--  copy element node svg  -->
    <xsl:copy>

        <!--  copy all attributes -->
        <xsl:copy-of select="@*"/>

        <!--  xsl:attribute will replace any attribute copied by above
instruction -->
        <xsl:attribute name="height"><!--  new value --></xsl:attribute>
        ...
        <!--  copy child nodes ... -->
        <xsl:copy-of select="node()"/>

        <!--  ... or apply templates to child nodes  -->
        <xsl:apply-templates/>

    </xsl:copy>
</xsl:template>

Note, however, that you cannot remove attributes this way,
only replace existing ones or add new ones.

If you want to remove attributes, you have to filter the attribute
select expression like

<xsl:copy-of select="@*[not(name()='height') and not(...)...]"/>

Regards - Klaus

> Thanks for your replies ;-)
>
> Lawrence Michel

Current Thread