Hello,
Commençons par remarquer que ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13
| <xsl:template match="//NIV2">
<xsl:element name="NIV">
<xsl:attribute name="Att1">
<xsl:value-of select="@Name3"/>
</xsl:attribute>
<xsl:attribute name="Att2">
<xsl:value-of select="ancestor::NIV1[1]/@Name2"/>
</xsl:attribute>
<xsl:attribute name="Att3">
<xsl:value-of select="????????????"/>
</xsl:attribute>
</xsl:element>
</xsl:template> |
serait nettement plus simple comme ceci :
1 2 3 4 5 6 7
| <xsl:template match="//NIV1">
<NIV
Att1="{NIV2/@Name3}"
Att2="{@Name2}"
Att3="{?????????????}"
/>
</xsl:template> |
- Il est bien plus clair de sélectionner l'élément englobant et aller chercher les informations dans ses fils, que de descendre jusqu'aux fils puis remonter au parent ensuite. Oublions un peu le yo-yo.
- Tu es en train de faire du XML, donc peut-être devrais-tu écrire les choses directement en XML. Tous ces <xsl:element> et <xsl:attribute> ne te facilitent pas la tâche.
... Ce qui ne nous dit pas comment faire le troisième.
en supposant que tu ne cherches que les suivants, la syntaxe serait celle-ci :
Att3="{following-sibling::*[NIV2/@Name3 = current()/NIV2/@Name3]/@Name2}"
- On prend les éléments suivants
- On ne garde que ceux qui ont un Name3 égal à celui de l'élément en cours
- Parmi ce qui reste, on affiche le Name2
Oui, mais on veut pas juste les suivants, on veut les suivants ou les précédents.
Donc en gros on veut juste exclure l'élément en cours en fait. C'est pas les moyens qui manquent, mais j'aime celui-ci :
<xsl:variables name="siblings" select="preceding-sibling::* | following-sibling::*">
puis réutiliser le même prédicat sur la variable $siblings.
Une remarque quand même : si le document à traiter est très gros, tout cela n'est pas un algorithme bien efficace.
Pour gagner en rapidité il faudrait repenser ça pour mettre un index sur les NIV1/NIV2/@Name3 afin de retrouver plus facilement ceux qui correspondent.
Partager