🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: fr.comp.text.xml
11 messages
11 total messages Started by YgoogleY Tue, 01 Dec 2009 14:36
compter avec une requĂȘte Xpath
#128
Author: YgoogleY
Date: Tue, 01 Dec 2009 14:36
45 lines
2094 bytes
Bonjour,

j'essaie de faire une requĂȘte simple avec xpath mais j'avoue ne rien
comprendre aux docs que je trouve sur le net.

Mon problÚme est le suivant : j'accÚde à des fichiers XML générés par
une application et ces fichiers sont parfois mal formés. J'obtiens un
fichier XML structuré comme ceci :

<Dataroot>
 <Niv1>
  <Niv2>
   <Niv3>data x</Niv3>
  </Niv2>
  <Niv2>
   <Niv3>data y</Niv3>
  </Niv2>
 </Niv1>
</Dataroot>

au lieu d'avoir ceci :

<Dataroot>
 <Niv1>
  <Niv2>
   <Niv3>data x</Niv3>
  </Niv2>
 </Niv1>
 <Niv1>
  <Niv2>
   <Niv3>data y</Niv3>
  </Niv2>
 </Niv1>
</Dataroot>

J'aimerai donc faire une requĂȘte qui compte le nombre de balises
<Niv2> contenues par une balise <Niv1> en sachant que si ce nombre est
> 1 alors je devrais faire un traitement.

Merci de votre aide.

Cordialement,

Y.
Re: compter avec une requĂȘte Xpath
#129
Author: Alain Ketterlin
Date: Tue, 01 Dec 2009 15:07
40 lines
1922 bytes
YgoogleY <jrmaub@gmail.com> writes:

> <Dataroot>
>  <Niv1>
>   <Niv2>
>    <Niv3>data x</Niv3>
>   </Niv2>
>   <Niv2>
>    <Niv3>data y</Niv3>
>   </Niv2>
>  </Niv1>
> </Dataroot>
>
> au lieu d'avoir ceci :
>
> <Dataroot>
>  <Niv1>
>   <Niv2>
>    <Niv3>data x</Niv3>
>   </Niv2>
>  </Niv1>
>  <Niv1>
>   <Niv2>
>    <Niv3>data y</Niv3>
>   </Niv2>
>  </Niv1>
> </Dataroot>

Je ne suis pas sûr de comprendre pourquoi le second est mieux que le
premier...

> J'aimerai donc faire une requĂȘte qui compte le nombre de balises
> <Niv2> contenues par une balise <Niv1> en sachant que si ce nombre est
> > 1 alors je devrais faire un traitement.

//Niv1[count(Niv2) &gt; 1]

(si tu peux éviter le // c'est aussi bien).

-- Alain.
Re: compter avec une requĂȘte Xpath
#130
Author: YgoogleY
Date: Tue, 01 Dec 2009 16:20
26 lines
2194 bytes
On 1 déc, 16:07, Alain Ketterlin <al...@dpt-info.u-strasbg.fr> wrote:

> Je ne suis pas sûr de comprendre pourquoi le second est mieux que le
> premier...

J'aurai dû préciser. Le fichier XML sert à migrer des données entre
deux applications. L'application source donne comme résultat le
premier fichier et l'application destinataire attend comme résultat le
deuxiÚme fichier. Comme je ne suis propriétaire d'aucune des 2
applications, je dois agir sur le fichier XML :-(

> > J'aimerai donc faire une requĂȘte qui compte le nombre de balises
> > <Niv2> contenues par une balise <Niv1> en sachant que si ce nombre est
> > > 1 alors je devrais faire un traitement.
>
> //Niv1[count(Niv2) &gt; 1]
>
> (si tu peux éviter le // c'est aussi bien).
>
> -- Alain.

Merci beaucoup pour la solution.

Cordialement,

Y.
Re: compter avec une requĂȘte Xpath
#131
Author: xmlizer
Date: Wed, 02 Dec 2009 06:37
53 lines
2630 bytes
On 1 déc, 15:36, YgoogleY <jrm...@gmail.com> wrote:
> Bonjour,
>
> j'essaie de faire une requĂȘte simple avec xpath mais j'avoue ne rien
> comprendre aux docs que je trouve sur le net.
>
> Mon problÚme est le suivant : j'accÚde à des fichiers XML générés par
> une application et ces fichiers sont parfois mal formés.

Attention : "mal formé" a déjà un sens dans le monde XML. "<a></A>"
est un document mal formé par exemple car les balises ne sont pas
équilibrée
Peut ĂȘtre vaut il mieux utiliser "non conforme aux attentes mĂ©tiers"

> J'obtiens un
> fichier XML structuré comme ceci :
>
> <Dataroot>
>  <Niv1>
>   <Niv2>
>    <Niv3>data x</Niv3>
>   </Niv2>
>   <Niv2>
>    <Niv3>data y</Niv3>
>   </Niv2>
>  </Niv1>
> </Dataroot>
>
> au lieu d'avoir ceci :
>
> <Dataroot>
>  <Niv1>
>   <Niv2>
>    <Niv3>data x</Niv3>
>   </Niv2>
>  </Niv1>
>  <Niv1>
>   <Niv2>
>    <Niv3>data y</Niv3>
>   </Niv2>
>  </Niv1>
> </Dataroot>
>
> J'aimerai donc faire une requĂȘte qui compte le nombre de balises
> <Niv2> contenues par une balise <Niv1> en sachant que si ce nombre est
>
> > 1 alors je devrais faire un traitement.


Pourquoi ne pas faire cette transformation en XSLT ?

Xmlizer
Re: compter avec une requĂȘte Xpath
#132
Author: YgoogleY
Date: Wed, 02 Dec 2009 07:31
15 lines
2041 bytes
On 2 déc, 07:37, xmlizer <xmli...@gmail.com> wrote:

> Peut ĂȘtre vaut il mieux utiliser "non conforme aux attentes mĂ©tiers"

Merci de cette précision. J'en prends bonne note.

>
> Pourquoi ne pas faire cette transformation en XSLT ?

Parce que je ne connais pas xslt. Parce que je trouve que les sources
d'informations sur Internet concernant XML et consort (xpath,
xslt,...) sont difficiles à comprendre pour un non initié. J'avoue que
dans le domaine informatique, c'est la premiĂšre fois que je sĂšche
autant sur un(e) "technologie/standard/...". D'habitude, je m'en sort
assez bien grĂące au Web mais pas lĂ . Peut -ĂȘtre que je vieilli :-)
Re: compter avec une requĂȘte Xpath
#134
Author: YgoogleY
Date: Wed, 02 Dec 2009 10:44
44 lines
2343 bytes
> On 2 déc, 07:37, xmlizer <xmli...@gmail.com> wrote:

> > Pourquoi ne pas faire cette transformation en XSLT ?
>

J'ai essayé de me remettre à XSLT, notamment à l'aide du site
http://www.w3schools.com/xml/default.asp

J'ai compris comment re-créer un document XML grùce à XSLT mais je ne
vois pas comment je peux fermer une balise comme je le souhaiterai.

C'est Ă  dire, en partant de ce document XML

<Dataroot>
 <Niv1>
  <Niv2>
   <Niv3>data x</Niv3>
  </Niv2>
  <Niv2>
   <Niv3>data y</Niv3>
  </Niv2>
 </Niv1>
</Dataroot>

Arriver Ă  celui-ci

<Dataroot>
 <Niv1>
  <Niv2>
   <Niv3>data x</Niv3>
  </Niv2>
 </Niv1>
 <Niv1>
  <Niv2>
   <Niv3>data y</Niv3>
  </Niv2>
 </Niv1>
</Dataroot>

En français, à chaque fois que je vois une balise <Niv2> je veux
insérer une balise juste avant </Niv1> et une balise <Niv1> ?

Merci de votre aide
Re: compter avec une requĂȘte Xpath
#135
Author: Alain Ketterlin
Date: Wed, 02 Dec 2009 12:45
56 lines
3293 bytes
YgoogleY <jrmaub@gmail.com> writes:

> J'ai essayé de me remettre à XSLT, notamment à l'aide du site
> http://www.w3schools.com/xml/default.asp

Personnellement, je ne connais rien de mieux que les recommandations
XPath et XSLT du W3C.

> En français, à chaque fois que je vois une balise <Niv2> je veux
> insérer une balise juste avant </Niv1> et une balise <Niv1> ?

Excuse moi d'ĂȘtre un peu brutal, mais c'est exactement comme cela qu'il
ne faut pas réfléchir. Tout devient plus simple si tu formules les
choses de la façon suivante :

chaque fois que j'ai un élément Niv1,
   s'il contient un seul Niv2,
     il suffit de reémettre ce Niv1 tel quel,
   et sinon,
     pour chacun des Niv2 qu'il contient
       émettre ce Niv2 "entouré" d'un Niv1

XSLT s'inspire des langages fonctionnels : on n'insĂšre ou supprime rien,
on crée le résultat à partir des données. (Et surtout, on n'insÚre pas
des balises, qui ne sont que des artefacts syntaxiques -- autrement dit,
on raisonne en termes d'éléments, pas en termes de balises.)

Pour ton problĂšme, voici une esquisse :

<xsl:template match="Dataroot">
  <xsl:copy>
    <xsl:apply-templates select="*"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Niv1">
  <xsl:choose>
    <xsl:when test="count(Niv2)=1">
      <xsl:copy-of select="."/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:for-each select="Niv2">
        <Niv1>
          <xsl:copy-of select="."/>
        </Niv1>
      </xsl:for-each>
    </xslotherwise>
  </xsl:choose>
</xsl:template>

(Fait de tĂȘte, et Ă©videmment non testĂ©.)

-- Alain.
Re: compter avec une requĂȘte Xpath
#136
Author: YgoogleY
Date: Wed, 02 Dec 2009 13:25
50 lines
3644 bytes
On 2 déc, 13:45, Alain Ketterlin <al...@dpt-info.u-strasbg.fr> wrote:
>
> Excuse moi d'ĂȘtre un peu brutal, mais c'est exactement comme cela qu'il
> ne faut pas réfléchir. Tout devient plus simple si tu formules les
> choses de la façon suivante :
>
> chaque fois que j'ai un élément Niv1,
>    s'il contient un seul Niv2,
>      il suffit de reémettre ce Niv1 tel quel,
>    et sinon,
>      pour chacun des Niv2 qu'il contient
>        émettre ce Niv2 "entouré" d'un Niv1
>
> XSLT s'inspire des langages fonctionnels : on n'insĂšre ou supprime rien,
> on crée le résultat à partir des données. (Et surtout, on n'insÚre pas
> des balises, qui ne sont que des artefacts syntaxiques -- autrement dit,
> on raisonne en termes d'éléments, pas en termes de balises.)

> -- Alain.

C'est vrai qu'expliqué comme cela, tout devient plus clair.

Mais au risque de passer pour un gros boulet (tant pis, lĂ  j'assume)
et à mon grand étonnement cela ne semble pas fonctionner. En fait
j''ouvre mon fichier XML source dans Firefox. Cela "mouline" et je
vois s'afficher toutes les données contenus dans mon fichier XML
source. Si je regarde le code source du fichier, j'obtiens toujours le
mĂȘme source que mon fichier d'origine.
Je me demande si j'ai bien compris tout le fonctionnement de la chose.
Pour moi en mettant ceci en entĂȘte de mon fichier XSL :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/
Transform">
<xsl:output method="xml" version="1.0" encoding="iso-8859-1"
standalone="yes" indent="yes"/>
...
</xsl:stylesheet>

cela me permettait d'afficher mon fichier XML d'origine transformé
dans Firefox et ensuite enregistrer le code source transformé dans un
autre fichier.

A défaut de pouvoir transformer le fichier d'origine à la volée ou
éventuellement mieux de pouvoir produire en sortie directement un
nouveau fichier XML conforme aux attentes métiers.

Cordialement
Re: compter avec une requĂȘte Xpath
#137
Author: Alain Ketterlin
Date: Wed, 02 Dec 2009 14:57
32 lines
2369 bytes
YgoogleY <jrmaub@gmail.com> writes:

[...]

Ta feuille a l'air d'ĂȘtre correcte.

> j''ouvre mon fichier XML source dans Firefox.
[...]

Je ne sais pas ce que peut ĂȘtre le problĂšme, je n'utilise jamais Firefox
pour faire cela. Juste pour ĂȘtre sĂ»r : as-tu mis une
processing-instruction <?xml-stylesheet> dans le fichier XML ?

[...]
> A défaut de pouvoir transformer le fichier d'origine à la volée ou
> éventuellement mieux de pouvoir produire en sortie directement un
> nouveau fichier XML conforme aux attentes métiers.

En général j'utilise xsltproc, de la façon suivante (sous Linux) :

xsltproc feuille.xsl fichier.xml > nouveau.xml

mais il y a bien sûr d'autres processeurs XSLT. Si tu nous dis ce que tu
utilises comme OS, quelqu'un pourra sûrement t'indiquer la marche à
suivre.

-- Alain.
Re: compter avec une requĂȘte Xpath
#138
Author: YgoogleY
Date: Wed, 02 Dec 2009 15:44
25 lines
2458 bytes
On 2 déc, 15:57, Alain Ketterlin <al...@dpt-info.u-strasbg.fr> wrote:

[...]
Juste pour ĂȘtre sĂ»r : as-tu mis une
> processing-instruction <?xml-stylesheet> dans le fichier XML ?

Oui

> En général j'utilise xsltproc, de la façon suivante (sous Linux) :
>
> xsltproc feuille.xsl fichier.xml > nouveau.xml
>
> mais il y a bien sûr d'autres processeurs XSLT. Si tu nous dis ce que tu
> utilises comme OS, quelqu'un pourra sûrement t'indiquer la marche à
> suivre.

Je travaille sur Windows XP Pro mais j'ai une station linux perso, je
vais donc pouvoir faire un test avec xsltproc. Et je vais faire des
recherches sur un processeur xslt pour windows. Je tiens au courant de
mes recherches, en tout cas, merci encore pour votre aide précieuse.

Cordialement,

Y.
Re: compter avec une requĂȘte Xpath
#139
Author: YgoogleY
Date: Wed, 02 Dec 2009 15:52
13 lines
1933 bytes
Petit compte-rendu :

j'ai trouvé msxsl qui est un processeur xslt pour windows et grùce à
votre code xsl (@Alain Ketterlin) j'ai un fichier tout beau tout neuf
en une seconde

Je suis bluffé, c'est vraiment super puissant.

Encore merci

Cordialement,

Y.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads