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
|