From: Eric van der Vlist (vdv@dyomedea.com)
Date: 05/07/2004 - 23:24
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é.
.../...
> >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']]
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.
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.
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>
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'])]
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
> >
> >Cordialement,
> >
> >Eric van der Vlist
>
> c'est moi qui vous remercie... :)
> Stéphane
>
> _________________________________________________________________
> MSN Actions Solidaires : http://www.msn.fr/actionssolidaires/ la
> solidarité à portée de click
>
>
> --
> 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)
--
Freelance consulting and training.
http://dyomedea.com/english/
Upcoming XML schema languages tutorial:
- Portland -half day- (27/07/2004) http://masl.to/?E6ED13728
------------------------------------------------------------------------
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
------------------------------------------------------------------------
--
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
|