From: Sir Pendenaor (pendenaor@hotmail.com)
Date: 06/07/2004 - 09:50
>X-OriginalArrivalTime: 05 Jul 2004 23:27:23.0616 (UTC)
>FILETIME=[A018BE00:01C462E7]
désolé, mais moi j'étais couché à cette heure la ;)
>
>
>Bonsoir,
>
>On Mon, 2004-07-05 at 16:01, Sir Pendenaor wrote:
>.../...
> > >On entre effectivement ici dans des domaines sur lesquels XPath n'est
> > >pas vraiment optimal...
> >
> > ça commence mal ... :(
>
>:)
> >
> > > >
> > > > Quelqu'un pourrait-il m'aider ?
> > >
> > >Ce qui me trouble dans votre demande (si je l'ai bien comprise), c'est
> > >que le résultat ne serait pas du XML bien formé puisqu'il inclurait une
> > >balise de fin </r> sans balise de début <r> :
> > >
> > ><fld type='begin'/>du texte</r>
> > ><r><fld type='middle'/>du texte</r>
> > ><r><fld type='end'/>
> >
> > euh ? vous êtes sur ? le xml que j'ai fourni semble convenir au parser
> > IE6...
> > <r><fld type='begin'/>du texte</r>
> > <r><fld type='middle'/>du texte</r>
> > <r><fld type='end'/>du texte</r>
> > chaque ligne commence par <r> et finit par </r> ...
>
>C'est ce que je voulais vérifier :) ...
>
>Cela ne correspond pas tout à fait à votre formulation en français "tout
>les noeuds entre <fld type='begin'/> et <fld type='end'/> inclus" qui
>correspondrait à :
>
><fld type='begin'/>du texte</r>
><r><fld type='middle'/>du texte</r>
><r><fld type='end'/>
>
>(puisque le noeud "r" qui englobe <fld type='begin'/> n'est pas entre
>"<fld type='begin'/>" et <fld type='end'/>) et ceci n'est pas du XML
>bien formé.
>
mea culpa, je n'est pas été assez précis, donc disons que le noeud <r>
m'intéresse aussi
>.../...
>
> > >Est-ce là encore réellement ce que vous souhaitez et si oui, pouvez
>vous
> > >formaliser en français les conditions entre éléments fld et bmk?
> >
> > ok, en fait l'opération peut se decomposer en 3:
> > 1. trouver un <fld type='middle'> situé entre 2 <bmk> de même @id (le
>1er
> > ayant @type='start' et le dernier @type='end').
>
>//fld[@type='middle' and preceding::bmk[@id=$id and @type='start'] and
>following::bmk[@id=$id and @type='end']]
moi j'ai trouvé ça:
//*[ancestor-or-self::*[preceding-sibling::bmk[@id='n' and @type='start']
and following-sibling::bmk[@id='n' and @type='end']]]//fld[@type='middle']
c'est beaucoup trop compliqué et je ne sait pas si c'est juste, mais j'y ai
mis du coeur :)
>
>Mais dans votre cas, ne recherchez vous pas plutôt l'élément "r" dans
>lequel ce fld est inclus? Ce serait alors :
>
>//r[fld[@type='middle' and preceding::bmk[@id=$id and @type='start'] and
>following::bmk[@id=$id and @type='end']]]
>
> > 2. à partir de ce <fld>, trouver 2 <fld>: le <fld> précédent avec
> > @type='begin' et le suivant avec @type='end'.
>
>A ce niveau là, les choses deviennent plus simple si vous utilisez XPath
>à partir de XSLT et pouvez stocker le résultat de 1.) dans une variable.
je travaille en C avec libxml2, je peux stocker le résultat de 1 dans une
variable...
>
>Dans le cas contraire, vous devrez souvent recopier des expressions qui
>peuvent être longues.
>
>Par rapport au <r/> que nous avons trouvé, le <r/> qui contient le <fld
>type='begin'/> précédent est
>"preceding-sibling::r[fld/@type='begin'][1]", celui qui contient le <fld
>type='end'/> suivant est "following-sibling::r[fld/@type='end'][1]".
>
> > 3. retourner l'ensemble des noeuds contenus entre ces 2 <fld> trouvés.
>
>Il n'y a pas d'expression XPath simple permettant de retourner
>l'ensemble des noeud entre deux noeuds.
ne peut on pas faire:
//*[preceding-sibling::r[fld/@type='begin'][1]] and
following-sibling::r[fld/@type='end'][1]]
>
>Il y a peut-être plus simple, mais vous pouvez vous en tirer en disant
>que vous voulez les <r/> suivant le premier et ayant le même nombre de
>fld/@type='end' que le premier.
>
>En XSLT, cela donne :
>
><?xml version="1.0" encoding="iso-8859-1"?>
>
><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>version="1.0">
><xsl:output indent="yes"/>
>
><xsl:param name="id">1</xsl:param>
>
><xsl:template match="/">
><xsl:variable name="s1" select="//r[fld[@type='middle' and
>preceding::bmk[@id=$id and @type='start'] and following::bmk[@id=$id and
>@type='end']]]"/>
><xsl:variable name="s2.1"
>select="$s1/preceding-sibling::r[fld/@type='begin'][1]"/>
><xsl:variable name="s2.2"
>select="$s1/following-sibling::r[fld/@type='end'][1]"/>
><xsl:variable name="s3"
>select="$s2.1/following-sibling::r[count(following-sibling::r[fld/@type='end'])
>= count($s2.1/following-sibling::r[fld/@type='end'])]"/>
><resultats>
><step1>
><xsl:copy-of select="$s1" />
></step1>
><step2>
><xsl:copy-of select="$s2.1" />
><xsl:copy-of select="$s2.2" />
></step2>
><step3>
><xsl:copy-of select="$s2.1|$s2.2|$s3" />
></step3>
></resultats>
></xsl:template>
>
></xsl:stylesheet>
c'est joli, mais je pas comprendre... *bruit de neurone qui lache* :)
>
>En XPath pur, il suffit de remplacer les variables par leurs
>définitions, soit :
>
>//r[fld[@type='middle' and preceding::bmk[@id=$id and @type='start'] and
>following::bmk[@id=$id and
>@type='end']]]/preceding-sibling::r[fld/@type='begin'][1]|//r[fld[@type='middle'
>and preceding::bmk[@id=$id and @type='start'] and following::bmk[@id=$id
>and
>@type='end']]]/following-sibling::r[fld/@type='end'][1]|//r[fld[@type='middle'
>and preceding::bmk[@id=$id and @type='start'] and following::bmk[@id=$id
>and
>@type='end']]]/preceding-sibling::r[fld/@type='begin'][1]/following-sibling::r[count(following-sibling::r[fld/@type='end'])
>= count(//r[fld[@type='middle' and preceding::bmk[@id=$id and
>@type='start'] and following::bmk[@id=$id and
>@type='end']]]/preceding-sibling::r[fld/@type='begin'][1]/following-sibling::r[fld/@type='end'])]
c'est joli, mais c'est lourd... *bruit de 3 neurone qui lache* :)
>
>Il y a peut être plus simple, mais cela fait ce que vous avez demandé de
>la manière dont vous l'avez demandé :) ...
>
>Cordialement,
>
>Eric van der Vlist
>
merci, et encore merci,
Stéphane
> > >
> > >Cordialement,
> > >
> > >Eric van der Vlist
> >
> > c'est moi qui vous remercie... :)
> > Stéphane
> >
_________________________________________________________________
Trouvez l'âme soeur sur MSN Rencontres http://g.msn.fr/FR1000/9551
--
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 30/07/2004 - 13:32 UTC
webmaster@xmlfr.org
|