Cliquez ici.
Accueil
 chercher             Plan du site             Info (English version) 
L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.Les listes de discussions XMLfr sont à votre disposition pour réagir sur nos articles ou simplement poser une question.Si vous ètes passionnée(e) par XML, pourquoi ne pas en faire votre métier ?XMLfr n'est heureusement pas le seul site où l'on parle de XML. Découvrez les autres grâce à XMLfr et à l'ODP.Les partenaires grâce auxquels XMLfr peut se développer.Pour tout savoir sur XMLfr.XMLfr sans fil, c'est possible !Pour ceux qui veulent vraiment en savoir plus sur XML.L'index du site.
 Commentaires et questions non techniques.Commentaires et questions techniques.

 
Cliquez ici.

From: Benoit.Lefevre@reuters.com
Date: 23/12/2003 - 16:37


> > Voici une des formulations XPath que j'ai esseille mais
> > qui n'a pas aboutie :
> >
> > ($set/* | $set/@* | $set/text())[position()!=1]
......
>
> Qu'est-ce qui ne marche pas à ce niveau?
>

      Plein de choses.

      J'avais esseille dans un premier temps ce type de formulation :

      car : $set[1]
      cdr : $set[position()!=1]

      Mais ceci a engendre des problemes du type "is not a node set".

      J'ai alors pris la formulation suivante :

      car : ($set/* | $set/@* | $set/text())[position()=1]
      cdr : ($set/* | $set/@* | $set/text())[position()!=1]

      Mais celles-ci distinguent le type d'axe sur le quel elle sont
      appliques.

      Donc avec une liste d'elements du type :
            (attribute1, attribute2, attribute3, tag1, tag2, tag3, text1, text2, text3)

      L'equivalent au car me renvoyait :
            (attribute1, tag1, text1)

      Et l'equivalent au cdr :
            (attribute2, attribute3, tag2, tag3, text2, text3)

      Enfin, j'ai depuis re-esseille la premiere formulation en
      ajoutant des appels a la fonction node-set.

      Ne reussisant pas a me servire de la fonction node-set
      sous XalanJ, j'ai esseille Saxon. Mais les problemes du type
      "is not a node set" reste entier.

      Je n'ai donc pas du placer les appels a la fonction node-set
      au bons endroits.

      J'ai ajoute a la fin de ce mail une copie du fichier XSL qui me
      pose probleme ainsi que le fichier XML avec lequel je fais
      mes testes.

> Par contre, elle est à manier avec précaution dans la mesure où les
> attributs sont considérés comme n'étant pas ordonnés dans un document
> XML. "@*[position=1]" est donc par nature suspect et susceptible de
> donner des résultats dépendants du parseur.
>

      Effectivement; je crois d'ailleur que mon probleme vient de la.

      D'un point de vue logique il est abusif d'esperer voir definit un ordre
      sur les attributs. Ne connaissant pas la norme par coeur (loin de la)
      j'attend peut etre trop des processeurs XSL :D

      Mais comme "position()" fonctionne tres bien sur des ensembles
      uniquements composes d'attributs, je peux me permettre de changer
      mon algorithme pour qu'il distingue le traitement des attributs du reste.

      C'est d'ailleur ce que vous avez fait dans xsltunit.xsl si je ne
      dis pas de betises.

      Par contre, pourquoi la norme a-t-elle la meme approche pour les
      noeuds de type text ?

      Ceux-ci sont place au meme niveau que les tagues et il me semble
      donc logique de pouvoir leurs attribuer une position.

Cordialement.

Benoit Lefevre.

Fichier XSL :
--------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  extension-element-prefixes="exsl"
  exclude-result-prefixes="exsl" >

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" media-type="xml"/>

  <xsl:template match="/">
     <xsl:element name="result">
       <xsl:call-template name="equal">
          <xsl:with-param name="tree1" select="exsl:node-set(//root/*[1])"/>
          <xsl:with-param name="tree2" select="exsl:node-set(//root/*[2])"/>
       </xsl:call-template>
     </xsl:element>
  </xsl:template>

  <xsl:template match="*" mode="nodeTypeTesting">N</xsl:template>
  <xsl:template match="@*" mode="nodeTypeTesting">A</xsl:template>
  <xsl:template match="comment()" mode="nodeTypeTesting">C</xsl:template>
  <xsl:template match="text()" mode="nodeTypeTesting">T</xsl:template>

  <xsl:template name="equal">
     <xsl:param name="tree1"/>
     <xsl:param name="tree2"/>
     <xsl:variable name="type1"><xsl:apply-templates select="exsl:node-set($tree1)" mode="nodeTypeTesting"/></xsl:variable>
     <xsl:variable name="type2"><xsl:apply-templates select="exsl:node-set($tree2)" mode="nodeTypeTesting"/></xsl:variable>
     <xsl:choose>
       <xsl:when test=" $type1 = $type2 ">
          <xsl:choose>
            <xsl:when test=" $type1 = 'N' ">
               <xsl:choose>
                 <xsl:when test="count($tree1/*) != count($tree2/*)">0</xsl:when>
                 <xsl:when test="count($tree1/@*) != count($tree2/@*)">0</xsl:when>
                 <xsl:when test="count($tree1/text()) != count($tree2/text())">0</xsl:when>
                 <xsl:when test="name($tree1)!=name($tree2)">0</xsl:when>
                 <xsl:otherwise>
                    <xsl:call-template name="shortCutTest">
                      <xsl:with-param name="subTree1" select="$tree1/* | $tree1/@* | $tree1/text()"/>
                      <xsl:with-param name="subTree2" select="$tree2/* | $tree2/@* | $tree2/text()"/>
                    </xsl:call-template>
                 </xsl:otherwise>
               </xsl:choose>
            </xsl:when>
            <xsl:when test=" $type1 = 'A' ">
               <xsl:choose>
                 <xsl:when test="name($tree1)=name($tree2) and $tree1=$tree2">1</xsl:when>
                 <xsl:otherwise>0</xsl:otherwise>
               </xsl:choose>
            </xsl:when>
            <xsl:when test=" $type1 = 'T' ">
               <xsl:choose>
                 <xsl:when test="$tree1 = $tree2">1</xsl:when>
                 <xsl:otherwise>0</xsl:otherwise>
               </xsl:choose>
            </xsl:when>
            <xsl:when test=" $type1 = 'C' ">1</xsl:when>
            <xsl:otherwise>0</xsl:otherwise>
          </xsl:choose>
       </xsl:when>
       <xsl:otherwise>0</xsl:otherwise>
     </xsl:choose>
  </xsl:template>

  <xsl:template name="shortCutTest">
     <xsl:param name="subTree1"/>
     <xsl:param name="subTree2"/>
     <xsl:variable name="carTestResult">
       <xsl:call-template name="equal">
          <xsl:with-param name="tree1" select="exsl:node-set($subTree1[1])"/>
          <xsl:with-param name="tree2" select="exsl:node-set($subTree2[1])"/>
       </xsl:call-template>
     </xsl:variable>
     <xsl:choose>
       <xsl:when test=" $carTestResult = '0' ">
          <xsl:call-template name="shortCutTest">
            <xsl:with-param name="tree1" select="exsl:node-set($subTree1[position()!=1])"/>
            <xsl:with-param name="tree2" select="exsl:node-set($subTree2[position()!=1])"/>
          </xsl:call-template>
       </xsl:when>
       <xsl:otherwise>0</xsl:otherwise>
     </xsl:choose>
  </xsl:template>

</xsl:stylesheet>
--------------------------------------

Fichier XML :
--------------------------------------
<root>
  <node1 param1="text" param2="text">
     <node2/>
     <node3/>
     text
     <node4/>
  </node>
  <node1 param1="text" param2="text">
     <node2/>
     <node3/>
     text
     <node4/>
  </node>
</root>
--------------------------------------

-----------------------------------------------------------------
        Visit our Internet site at http://www.reuters.com

Get closer to the financial markets with Reuters Messaging - for more
information and to register, visit http://www.reuters.com/messaging

Any views expressed in this message are those of the individual
sender, except where the sender specifically states them to be
the views of Reuters Ltd.

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

 

xml tech

Discussions techniques au sujet de XML.

Cette liste est à votre disposition pour discuter en français de tout sujet technique lié à XML.



Devenez rédacteur <XML>fr et contribuez au développement du xml francophone !
Les documents publiés sur ce site le sont sous licence "Open Content"
Conception graphique
  l.henriot@online.fr  

Conception, réalisation et hébergement