XSLT: Comment remplacer le premier frère par une concaténation de tous les frères et sœurs?


Lucie

J'ai du mal à mettre en œuvre une transformation XSL.

J'ai besoin de transformer ceci:

<records>
    <item>
        <id type="uid">1</id>
        <name>Homepage</name>
        <attr>AB308E</attr>
    </item>
    <item>
        <id type="uid">5</id>
        <name>Electronics</name>
        <attr>F04550</attr>
    </item>
    <item>
        <id type="uid">8</id>
        <name>Accessories</name>
        <attr>00EE80</attr>
    </item>
</records>

dans ceci:

<records>
    <item>
        <id type="uid">1</id>
        <category>Homepage - Electronics - Accessories</category>
        <attr>AB308E</attr>
    </item>
    <item>
        <id type="uid">5</id>
        <name>Electronics</name>
        <attr>F04550</attr>
    </item>
    <item>
        <id type="uid">8</id>
        <name>Accessories</name>
        <attr>00EE80</attr>
    </item>
</records>

Je sais que cela n'a pas beaucoup de sens sémantiquement parlant, mais c'est un hack dont j'ai besoin pour injecter des données d'une manière spécifique dans une interface.

Règle n ° 1: la namebalise du premier itemde chaque recordsbalise (il y a beaucoup d'enregistrements dans le fichier réel) se transforme categoryet contient la concaténation de tous les noms d'éléments de la recordsportée actuelle

Règle n ° 2: les itembalises qui ne sont pas le premier enfant de recordssont inchangées.

J'ai essayé d'utiliser des <xsl:value-of select="concat(' - ', .)"/>règles mais je n'ai pas eu de chance.

Quelqu'un saurait-il comment y parvenir?

Vincent

Essaye ça:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="records/item[1]/name">
        <category>        
            <xsl:for-each select="../../item/name">
                <xsl:value-of select="." />
                <xsl:if test="position() != last()">
                    <xsl:value-of select="' - '" />
                </xsl:if>
            </xsl:for-each>
        </category>
    </xsl:template>
</xsl:stylesheet>

Articles connexes