From: Cyril Jandia (cjandia@logfi.fr)
Date: 18/10/2002 - 14:04
Bonjour,
> -----Message d'origine-----
> De : Manfredi Emmanuel
> À : 'xml-tech@xmlfr.org'
> Objet : [xml-tech] XSLT et compteur
>
> Bonjour,
> [...]Je veux appliquer un traitement à tous les sous-éléments d'un élément de
ma
> racine dont l'identifiant est associé à un identifiant précis dans un autre
> élément de ma racine. En simplifiant, mon Schéma serait:
> [...]Est-ce que quelqu'un à une solution pour le compteur, ou une autre idée à
me
> proposer?
Au moins deux problèmes dans la formulation de votre question :
1) (assez courant) vous vous focaliser trop sur le comment faire (via un
"compteur" traditionnel, une boucle, etc), et, surtout, en oubliant le caractère
fonctionnel de XSLT/XPath - qui privilégient plutôt le "sur quoi faire (quels
noeuds) et pourquoi le faire (à quelles conditions)"
2) plus ennuyeux, votre échantillon de données source XML n'est pas ... vraiment
du XML (même "de loin" ;=)! ce qui du coup laisse le lecteur assez perplexe
quant aux façons de l'interpréter lui et les traitements possibles dessus...
Néanmoins, il faut reconnaître que vous avez fait un effort (non négligeable,
c'est bien ;=) pour essayer d'abstraire le problème (cf. votre paragraphe
"pertinent" que je reprends ci-dessus).
NB : je ne suis donc pas sûr de vous avoir bien compris, mais je peux toujours
essayer de vous proposer ceci...
... à supposer que cela réponde bien à votre question, ce n'est probablement pas
une solution optimale mais elle aura au moins le mérite de vous mettre sur la
piste et de vous confirmer que la voie "de la variable qui s'incrémente, pour se
bricoler un compteur" (une quasi-hérésie XSLT ;=) n'est certainement pas la
bonne :
Entrée -- data.xml --
<?xml version="1.0" encoding="iso-8859-1" ?>
<Doc>
<Struct id="e.1">
<Struct id="e.1.1" assoc="IdA1"/>
<Struct id="e.1.2" assoc="IdA2"/>
</Struct>
<Struct id="e.2">
<Struct id="e.2.1" assoc="IdB1"/>
<Struct id="e.2.2" assoc="IdB2"/>
</Struct>
<Struct id="e.3">
<Struct id="e.3.1">
<Id-A>IdA1</Id-A>
<Id-B>IdB1</Id-B>
</Struct>
<Struct id="e.3.2">
<Id-A>IdA1</Id-A>
<Id-B>IdB3</Id-B>
</Struct>
<Struct id="e.3.3">
<Id-A>IdA2</Id-A>
<Id-B>IdB2</Id-B>
</Struct>
</Struct>
</Doc>
Transfo -- test.xsl --
<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:transform
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
Eléments pour lesquels il existe des associations "Id-A, Id-B" :
<ul>
<xsl:for-each select="//Struct[Id-A and Id-B]">
<xsl:variable name="a" select="//Struct[@assoc=current()/Id-A]" />
<xsl:variable name="b" select="//Struct[@assoc=current()/Id-B]" />
<xsl:if test="(count($a) > 0) and (count($b) > 0)">
<li><xsl:value-of select="@id" /></li>
</xsl:if>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:transform>
Résultat -- out.html --
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
Eléments pour lesquels il existe des associations "Id-A, Id-B" :
<ul>
<li>e.3.1</li>
<li>e.3.3</li>
</ul>
</body>
</html>
> Merci
En espérant que cela aide --
Bien à vous,
--CJ
--
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
|