Re: [xsl] xsl:copy - change attributes and tag name

Subject: Re: [xsl] xsl:copy - change attributes and tag name
From: "Joerg Heinicke" <joerg.heinicke@xxxxxx>
Date: Sun, 7 Apr 2002 02:14:37 +0200
For such tasks <xsl:key> is the best approach.

<xsl:stylesheet>
    <!-- build a lookup-table with @IdRef as key -->
    <xsl:key name="Indice" match="Indice" use="@IdRef"/>

    <xsl:template match="TreeData">
        <tree>
            <xsl:apply-templates select="Indice[not(@IdRef)]"/>
        </tree>
    </xsl:template>

    <xsl:template match="Indice">
        <tree>
            <xsl:apply-templates select="@*"/>
            <!-- add here new attributes via <xsl:attribute/> -->

            <!-- applies templates to all attributes and all elements in the
            lookup-table named 'Indice', which have as their @IdRef the
            value of the current @IdIndice -->
            <xsl:apply-templates select="key('Indice', @IdIndice)"/>
        </tree>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy-of select="."/>
    </xsl:template>

    <xsl:template match="@Nombre">
        <xsl:attribute name="text"><xsl:value-of
select="."/></xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Does this solve all your problems and answer all your questions?

Joerg

> Hi folks!
> I have this parent-child xml.
> <TreeData>
> <Indice IdIndice="1" Nombre="Omint Analisis" />
> <Indice IdIndice="3" IdRef="1" Nombre="OMINT: Precios"/>
> <Indice IdIndice="4" IdRef="1" Nombre="210 / Omint"/>
> <Indice IdIndice="5" Nombre="Swiss Medical Analisis"/>
> <Indice IdIndice="6" IdRef="5" Nombre="Swiss Precios"/>
> <Indice IdIndice="7" IdRef="1" Nombre="310 / Omint"/>
> <Indice IdIndice="8" IdRef="7" Nombre="Cobertura" IdDoc="1"/>
> </TreeData>
>
> What I want to do is putting it into a hierarchical format, which I do
with
> this xsl
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> version="1.0">
> <xsl:template match="/">
> <tree>
>  <xsl:apply-templates select="TreeData/*[not(@IdRef)]"/>
> </tree>
> </xsl:template>
>
> <xsl:template match="*|@*">
> <xsl:copy>
> <xsl:apply-templates select="//*[@IdRef = current()/@IdIndice]|@*"/>
>  </xsl:copy>
> </xsl:template>
> </xsl:stylesheet>
>
> So I get
> <tree>
> <Indice IdIndice="1" Nombre="Omint Analisis">
> <Indice IdIndice="3" IdRef="1" Nombre="OMINT: Precios Directos" />
> <Indice IdIndice="4" IdRef="1" Nombre="210 / Omint" />
> <Indice IdIndice="7" IdRef="1" Nombre="310 / Omint">
> <Indice IdIndice="8" IdRef="7" Nombre="Cobertura" IdDoc="1" />
> </Indice>
> </Indice>
> <Indice IdIndice="5" Nombre="Swiss Medical Analisis">
> <Indice IdIndice="6" IdRef="5" Nombre="Swiss Precios" />
> </Indice>
> </tree>
>
> Now I want 3 things:
> 1. instead of generate <Indice> tags I want to get <tree> tags.
> So I would get
> <tree>
> <tree ... />
> <tree ..>
> <tree ..>
> </tree>
> </tree>
>
> 2. I want to change the "Nombre" attribute to "text" attribute
> So I would have
> <tree text="210/Omint" ...>
> 3. How do I add another attribute to each entry?
> <tree text="..." addedAttr="something">
>
> thanks in advance!
> Matias


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread