[XSLT] création d'attributs multiples
Bonjour à tous
Voici mon problème :
J'utilise une xsl qui créé un attribut "folio" à l’élément "niv1"
et lui donne la valeur de l'attribut "folio" du dernier élément "rp"
En plus de l'attribut "folio" dans "niv1" je voudrais aussi ajouter un deuxième attribut "id=niv1x", le x étant le rang d’apparition des éléments "niv1" dans le xml.
Avec cette xsl, si l’attribut "id=niv1x" est déjà présent dans "niv1" au moment de passer la xsl il est supprimé.
En résumé, j' ai ça :
<niv1><int>
Et je voudrais avoir ça :
<niv1 id="niv1xx" folio="x"><int>
(id="niv1xx" doit être numéroté 01,02… 10,11…)
Voici la xsl :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- donner le @folio du rp précédent -->
<xsl:template match="niv1">
<xsl:copy>
<xsl:attribute name="folio">
<xsl:value-of select="preceding::rp[1]/@folio"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- tout le reste : copier tel que et appeler les templates des enfants -->
<xsl:template match="*|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet> |
Merci d'avance pour vos réponses
création d'attributs multiples
Merci pour ta réponse qui m'as permis d'avancer
J'en suis arrivé à l'xsl ci-dessous qui, à partir de :
<niv1>
me donne :
<niv1 id="x" folio="x"/>
ce qui est déjà pas mal mais pour que ce soit vraiment bien je voudrais obtenir :
<niv1 id="niv1xx" folio="x"/>
donc niv1 accolé au numéro d'ordre du nœud <niv1>
le numéro d'ordre sous la forme : 01,02…10,11 etc.
et comme tu peux le constater, je ne vois pas comment ajouter niv1 devant la numérotation.
Encore merci pour ton aide :)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- éléments part et chap: donner le @folio du rp précédent -->
<xsl:template match="niv1">
<xsl:copy>
<xsl:attribute name="id">
<xsl:value-of select="count(preceding::niv1)+1"/>
<!-- <xsl:value-of select="format-number(numéro,'0#')"/> -->
</xsl:attribute>
<xsl:attribute name="folio">
<xsl:value-of select="preceding::rp[1]/@folio"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- tout le reste : copier tel que et appeler les templates des enfants -->
<xsl:template match="*|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet> |
création d'attributs multiples
Effectivement, mais j'avais essayé l'expression suivante :
<xsl:value-of select="concat('niv1', format-number(count(preceding::niv1)+1, '0#'))"/>
qui ne me retourne plus rien à partir de la première occurrence de "niv1"
j'aurais loupé quelque-chose au niveau de la syntaxe??!! :calim2:
création d'attribut multiples
Je crois que j'ai trouvé
Avec ça :
Code:
<xsl:value-of select="concat('niv1',format-number(count(preceding::niv1)+1, '00'))"/>
J'ai un zéro devant 1 à 9
Merci pour ton aide :ccool: