1 réponse
le xsl peut être celui-là :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="package">
<xsl:copy>
<xsl:call-template name="get_premier_non_vide">
<xsl:with-param name="index" select="1"/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="get_premier_non_vide">
<xsl:param name="index"/>
<xsl:if test="package_desc[$index]">
<xsl:choose>
<xsl:when test="package_desc[$index]/text() != ''">
<xsl:copy-of select="package_desc[$index]"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="get_premier_non_vide">
<xsl:with-param name="index" select="$index + 1"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="package">
<xsl:copy>
<xsl:call-template name="get_premier_non_vide">
<xsl:with-param name="index" select="1"/>
</xsl:call-template>
</xsl:copy>
</xsl:template>
<xsl:template name="get_premier_non_vide">
<xsl:param name="index"/>
<xsl:if test="package_desc[$index]">
<xsl:choose>
<xsl:when test="package_desc[$index]/text() != ''">
<xsl:copy-of select="package_desc[$index]"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="get_premier_non_vide">
<xsl:with-param name="index" select="$index + 1"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
29 févr. 2008 à 10:39
ça répond tout à fait à mon problème.
J'ai toutefois une autre interrogation. Est-il possible de rendre cette fonction plus générique en l'utilisant pour d'autres ensembles de nœuds. J'ai fait plusieurs tentatives en modifiant ton code mais je n'y arrive pas...je débute en XSLT :(
Par exemple :
donne :
Et enfin une dernière chose. J'ai d'autres traitements à faire comme supprimer certains éléments ou attributs. j'avais donc procédé d'une autre manière pour faire ces traitements. Du coup, ça ne me semble pas compatible avec cette nouvelle fonction. Et je n'arrive pas à conserver ce que j'avais fait avec cette nouvelle fonction. (J'exprime mal mais c'est pas évident à expliquer)
Enfin bref, voilà un exemple de la feuille XSLT que j'avais commencé. En gros cela recopie tout sauf les éléments et attributs précisés. Mais avec l'appel à la fonction maintenant, je n'ai plus aucun élément recopié sous le nœud package (dans ce cas) à part package_desc et les attributs ne sont pas non plus supprimés.
29 févr. 2008 à 16:39
Voilà une version générique, qui s'applique à tous les noeuds fils de "package". C'est plus court que l'autre, et beaucoup plus élégant.
Ce site est pas mal pour commencer : www.laltruiste.com
Après il faut compléter avec d'autres ressources.
Ciao
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="package">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:if test="not(preceding-sibling::*[text() != '' and name() = name(current())]) and text() != ''">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
3 mars 2008 à 11:37
effectivement ça correspond davantage à mes besoins.
Par contre j'ai voulu rajouter la condition qui dit que si aucun élément non null n'a été trouvé, il faut copier le dernier élément null, mais une fois de plus je n'y arrive pas (je crois que XSLT n'ait pas fait pour moi). J'ai fait ça :
et pour l'exemple suivant :
cela donne :
autre chose, je n'arrive toujours pas à intégrer ma suppression d'attribut:
par exemple dans l'exemple précédent,je veux supprimer l'attribut language.
En ajoutant la ligne à la feuille de style, cela ne fonctionne pas. j'imagine que c'est parce que la précédente règle surchage cette règle. Mais du coup je ne vois pas comment faire.
3 mars 2008 à 14:29
Il ne manque plus qu'à trouver une solution pour mon histoire de dernier élément null et j'en aurais fini avec XSLT...pour cette fois!
3 mars 2008 à 15:06
j'ai finalement trouvé une solution pour mon problème de dernier null. Je sais pas si c'est la meilleure façon de le faire mais en tout cas ça à l'air de fonctionner :
En tout cas, merci encore, je ne pense pas que je m'en serais sorti sans ton aide précieuse!