From: Paul Terray (terray@4dconcept.fr)
Date: 08/08/2001 - 09:40
At 19:26 07/08/01 +0200, you wrote:
>--------------------------------------------
>|<xsl:template match="*">
>|<xsl:copy/><xsl:if test = "not(./text())">
>|<xsl:apply-templates/>
>|</xsl:if>
>|</xsl:template>
>-------------------------------------------
>
> Qui me semble moins beau que ce que tu proposes
Tu limites les sous-noeuds des éléments. Disons que c'est moins dans
l'esprit XSLT. Mais l'important, ce que cela fasse ce que tu veux...
Par contre, tu empêches de traiter avec ta solution les éléments mélangés
au texte, genre :
<a><b>du texte <c>avec</c> des elements </b></a>
Ici, <c> n'apparaitra pas, puisque "not(./text())" est faux.
> Mais je me pose encore quelques questions :
>
> 1) quels sont les differences fondamentales entre "." , "self" et
> "current()" ?
> Y at-il une difference (pour ces trois elements du langage en tous cas)
> lorsqu'on les emplois :
>
> - dans un attribut match
> - dans un attribut test
> - dans un attribut select
>
> J'ai l'impression d'etre passe 10 fois a cote de la solution a cause de
> petites variations sur l'emplois de tous ces elements que je ne maitrise
> pas encore ...
Pour répondre rapidement à beaucoup de ces questions :
http://www.mulberrytech.com/quickref/index.html
L'aide mémoire XSLT est absolument indispensable, et répondra à beaucoup de
ces questions. Par exemple :
"." = "self::node()"
"current()" est un peu plus compliqué à comprendre. Pour une fois, la norme
est assez claire :
La fonction current() renvoie le noeud courant. Hors de crochets,
"current()" = "."
Donc,
<xsl:value-of select="current()"/>
est identique à
<xsl:value-of select="."/>
Par contre, dans des crochets, "current()" reprend le noeud courant en
dehors de l'expression. Par exemple :
<xsl:apply-templates select="//glossary/item[@name=current()/@ref]"/>
appliquera un template à tous les item dont l'attribut "name" est identique
à l'attribut "ref" du noeud courant.
Alors que
<xsl:apply-templates select="//glossary/item[@name=./@ref]"/>
est identique à
<xsl:apply-templates select="//glossary/item[@name=@ref]"/>
C'est à dire que seul les item dont l'attribut "name" est identique à
l'attribut "ref" seront sélectionnés.
En gros, "current()" permet de sortir du contexte induit par les crochets.
> 2) peut on "deporter" le test <xsl:If> du template directement dans
> l'attribut
> match de ce dernier sans avoir recoure a plusieurs templates ??
Ca n'a pas de sens : tu veux effectivement sélectionner tous les éléments
pour les copier, qu'il contiennent du texte ou pas. Honnêtement, pour plein
de raisons, faire un template pour le text() est le plus éfficace.
> 3) Je ne souhaite pas conserver la structure, mais par contre j'ai
> toujours
> un mal fou lorsque je fait du output en mode text a indenter la
> sortie comme
> je le souhaite.Je ne comprend pas comment les blancs dans le document
> source sont pris en compte lors de la transformation.
Sans vouloir jouer les puristes, il n'y a aucun moyen de controler
correctement ce genre de chose, et surtout, pour une sortie XML, cela n'a
aucune importance.
De toute façon, je conseille systématiquement d'utiliser la balise
<xsl:text> pour insérer même un retour chariot, et travailler en mode XML
direct.
Voila.
--
Paul TERRAY - Ingénieur Systèmes Documentaires
4Dconcept
Centre d'affaires - 22, rue Etienne de Jouy
78353 Jouy en Josas CEDEX
Tel. 01 34 58 70 70 - Fax. 01 39 46 06 90
email : terray@4dconcept.fr
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|