Re: Traitement selon sous-balise

Eric van der Vlist <[email protected]> Wed, 25 Jun 2008 18:56:10 +0200
Newsgroups gmane.text.xml.french.tech
Organization Dyomedea (http://dyomedea.com)
Message-ID <1214412970.12479.67.camel@localhost>
Bonjour,
Le mercredi 25 juin 2008 =C3=A0 17:47 +0200, David DAZ. Duriez a =C3=A9cr=
it :
> Bonjour,
> =20
>=20
> J'ai un xml, avec la partie suivante :=20
>=20
> <_06_auteur apagenum=3D"1" pagenum=3D"1">
>=20
> <Emph cstyle=3D"06_auteur_c">Fran=C3=A7oise</Emph>
>=20
> <Emph cstyle=3D"07_biographie"> R=C3=A9dactrice </Emph>
>=20
> </_06_auteur>
>=20
> =20
>=20
> Je voudrai arriv=C3=A9 =C3=A0 ceci :
>=20
> <auteur>Fran=C3=A7oise</auteur>
>=20
> <biographie>r=C3=A9dactrice</biographie>
>=20
> =20
>=20
> Pour le moment le code xsl est :
>=20
>           <xsl:when
> test=3D"contains(translate(name(current()),$translate-from,$translate-t=
o),'aute
> ur')">
>=20
>               <xsl:call-template name=3D"auteur"/>
>=20
>           </xsl:when>
>=20
> =20
>=20
>=20
>=20
> <xsl:template name=3D"auteur" match=3D"//Emph[contains(@cstyle,'auteur'=
)]">
>=20
>=20
>       <xsl:choose>
>=20
> =20
>=20
>         <xsl:when test=3D"Emph[contains(@cstyle,'auteur')]">
>=20
>           <auteur>
>=20
>             <xsl:apply-templates />
>=20
>           </auteur>
>=20
>         </xsl:when>
>=20
> =20
>=20
>        <xsl:when test=3D"Emph[contains(@cstyle,'biographie')]">
>=20
>          <biographie>
>=20
>            <xsl:apply-templates />
>=20
>          </biographie>
>=20
>          </xsl:when>
>=20
> =20
>=20
>      <xsl:otherwise>
>=20
>        <auteur_si_pas_sousbalise>
>=20
>             <xsl:value-of select=3D"."/>
>=20
>        </auteur_si_pas_sousbalise>
>=20
>      </xsl:otherwise>
>=20
> =20
>=20
>      </xsl:choose>
>=20
>    </xsl:template>
>=20
> =20
>=20
>=20
>=20
> Et j'obtient le r=C3=A9sultat suivant :
>=20
> <auteur>
>=20
> <auteur_si_pas_sousbalise>Fran=C3=A7oise</auteur_si_pas_sousbalise>
>=20
>  R=C3=A9dactrice
>=20
> </auteur>
>=20
> =20
>=20
> Quelqu'un pourrait-il m'aider ?, sa fait une journ=C3=A9e que je cherch=
e...

Lorsque votre transformation arrive sur l'=C3=A9l=C3=A9ment =EF=BB=BF<_06=
_auteur/>, la
condition de votre =EF=BB=BF<xsl:when
test=3D"contains(translate(name(current()),$translate-from,
$translate-to),'auteur')"> est v=C3=A9rifi=C3=A9e et vous appelez le
template =EF=BB=BF<xsl:template name=3D"auteur"
match=3D"//Emph[contains(@cstyle,'auteur')]">.

La premi=C3=A8re condition rencontr=C3=A9 dans le xsl:choose est v=C3=A9r=
ifi=C3=A9e, vous
g=C3=A9n=C3=A9rez un =C3=A9l=C3=A9ment =EF=BB=BF<auteur> et vous ex=C3=A9=
cutez les templates sur les sous
=C3=A9l=C3=A9ments de =EF=BB=BF =EF=BB=BF<_06_auteur/>.

Parmi ces sous =C3=A9l=C3=A9ments, l'=C3=A9l=C3=A9ment =EF=BB=BF<Emph
cstyle=3D"06_auteur_c">Fran=C3=A7oise</Emph> v=C3=A9rifie la condition du
template =EF=BB=BF<xsl:template name=3D"auteur"
match=3D"//Emph[contains(@cstyle,'auteur')]"> qui est donc ex=C3=A9cut=C3=
=A9 une
deuxi=C3=A8me fois avec un noeud contexte qui est maintenant =EF=BB=BF=EF=
=BB=BF<Emph
cstyle=3D"06_auteur_c">Fran=C3=A7oise</Emph> et cette fois ci, aucune des
conditions du xsl:choose n'est v=C3=A9rifi=C3=A9e et vous g=C3=A9n=C3=A9r=
ez
donc =EF=BB=BF<auteur_si_pas_sousbalise>Fran=C3=A7oise</auteur_si_pas_sou=
sbalise>.

La transformation arrive ensuite sur l'=C3=A9l=C3=A9ment =EF=BB=BF<Emph
cstyle=3D"07_biographie"> R=C3=A9dactrice </Emph> et, ne trouvant pas de
template pour cet =C3=A9l=C3=A9ment, elle applique le template par d=C3=A9=
faut qui
affiche la valeur de l'=C3=A9l=C3=A9ment (=EF=BB=BFR=C3=A9dactrice).=20

Il vous faut dissocier les traitements (et tests) faits au moment de
l'appel de ce template via call-template et de celui faits au moment de
son ex=C3=A9cution via apply-templates.

Pour simplifier le tout, vous pourriez =C3=A9crire quelque chose du type =
:


=EF=BB=BF          <xsl:when test=3D"contains(translate(name(current()),$=
translate-from,$translate-to),'auteur')">

              <xsl:apply-templates/>

          </xsl:when>

=20

=20

<xsl:template match=3D"Emph[contains(@cstyle,'auteur')]">


          <auteur>

            <xsl:apply-templates />

          </auteur>


</xsl:template>

=EF=BB=BF<xsl:template match=3D"Emph[contains(@cstyle,'biographie')]">


         <biographie>

           <xsl:apply-templates />

         </biographie>


</xsl:template>

=EF=BB=BF<xsl:template  match=3D"Emph">


       <auteur_si_pas_sousbalise>

            <xsl:value-of select=3D"."/>

       </auteur_si_pas_sousbalise>

</xsl:template>

Cordialement,

Eric van der Vlist
> =20
>=20
> Merci d'avance.
>=20
--=20
GPG-PGP: 2A528005
Have you ever thought about unit testing XSLT templates?
                                                     http://xsltunit.org
------------------------------------------------------------------------
Eric van der Vlist       http://xmlfr.org            http://dyomedea.com
(ISO) RELAX NG   ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------


-- Attached file included as plaintext by Ecartis --

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQBIYniqDvn+ZCpSgAURArGnAKChgiFgg51t6d+XhXrBs872WEQjxACfeBwV
9YWFJp2vR/jE0EbxhwPkWjQ=3D
=3D9I3B
-----END PGP SIGNATURE-----