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-----