Bonjour,
Le jeudi 03 février 2005 à 02:39 +0100, alexandre a écrit :
> Bonjour à tous,
>
> J'ai une erreur lorsque j'utilise "following-sibling" dans une
> expression de "match=.."
> (par exemple : <xsl:template match="following-sibling::noeud">)
> (error : xsltCompileStepPattern : 'child' or 'attribute' expected)
> message d'erreur retourné par xsltproc sous linux (voir infos version à
> la fin du message, si ca peut éclairer).
>
> Je ne sais pas si il s'agit de ma mauvaise compréhension des expressions
> qu'on peut utiliser dans un "match=.." (fort probable),
Je le crains ;-) ...
Les restrictions imposées aux expressions XPath dans l'attribut match
d'un template sont définies par la recommandation XSLT qui dit
(http://xmlfr.org/w3c/TR/xslt/#section-Defining-Template-Rules) :
Un motif doit concorder avec la grammaire des motifs (Pattern). Un motif
est un ensemble de motifs de chemins de localisation séparés par |. Un
motif de chemin de localisation est un chemin de localisation dont les
étapes n'utilisent que les axes child ou attribute. Bien que les motifs
ne doivent pas utiliser l'axe descendant-or-self, ils peuvent utiliser
l'opérateur // tout aussi bien que l'opérateur /. Les motifs de chemins
de localisation peuvent aussi commencer par un appel de fonction id ou
key avec un argument littéral. Les prédicats d'un motif peuvent utiliser
n'importe quelle expression exactement comme ceux des chemins de
localisation.
Avant d'en donner la grammaire sous forme EBNF...
> ou si il s'agit
> d'une limitation du processeur xslt que j'utilise.
>
> En revanche, si je met le "following-sibling" dans un "select=.."
> (par exemple : <xsl:apply-templates select="following-sibling::noeud"/>)
> ca fonctionne sans problème.
>
> Voilà, ma question s'arrète là.
> Merci d'avance à tous ceux qui pourraient éclairer ma lanterne.
>
> Alexandre
>
> PS.. si vous voulez plus de détails sur ce qui m'ammène à poser cette
> question :
> J'essaies de transformer la structure d'un document xml.
>
> <!-- exemple simplifié et synthétique du document original -->
> <..>
> <parent>(1 à n)
> <sibling>(1 à n)
> <sibling-précédent>
> <detail ordre="1">detail 1 (à n)<![CDATA[code]]></detail>
> <..>
> </parent>
> <..>
> <!-- ----------------------------------------------------- -->
>
> <!-- résultat souhaité------------------------------------ -->
> <..>
> <parent>(1 à n)
> <sibling>(1 à n)
> <sibling-précédent>
> <details>
> <detail ordre="1">detail 1 (à n)<![CDATA[code]]></detail>
> <..>
> </details>
> </parent>
> <..>
> <!-- ----------------------------------------------------- -->
>
> J'aimerais donc utiliser
> <!-- par exemple ---------------------------------------- -->
> <xsl:template match="/">
> <xsl:copy>
> <xsl:apply-templates select="@* | * | text()"/>
> </xsl:copy>
> </xsl:template>
>
> <xsl:template match="following-sibling::sibling-précédent">
> <details>
> <xsl:copy>
> <xsl:apply-templates select="@* | * | text()"/>
> </xsl:copy>
> </details>
> </xsl:template>
Pour contourner cela, il faut écrire :
<xsl:template match="*::[preceding-sibling::sibling-précédent]">, c'est
à dire (si j'ai bien compris ce que vous voulez obtenir) "n'importe quel
élément dont un "preceding sibling" est l'élément "sibling-précédent".
> <!-- ----------------------------------------------------- -->
>
> ... ça serait sympa si ça marchait comme ça... au moins j'aurais
> l'impression de comprendre un peu xslt et xpath ;)
> Outre le problème principal, j'ai un autre petit problème : les copies
> (<xsl:copy> ou <xsl:copy-of..>) suppriment mes balises <![CDATA[]]>. Je
> ne sais pas comment faire pour les conserver.
> ...merci d'avoir lu jusque là :]
Il n'y a pas qu'eux qui les suppriment :-) ... Le modèle de données
XPath ne connaît pas la notion de CDATA et les transformations XSLT ne
les voient pas (elles sont traduites en noeuds texte comme le reste).
Par contre, vous pouvez spécifier, avec l'attribut
cdata-section-elements de l'élément xsl:output, une liste d'éléments
dont vous souhaitez forcer l'écriture sous forme de sections CDATA
(qu'ils aient été écrits de la sorte dans le document source ou non) :
http://xmlfr.org/w3c/TR/xslt/#section-XML-Output-Method
Cordialement,
Eric van der Vlist
--
If you have a XML document, you have its schema.
http://examplotron.org
------------------------------------------------------------------------
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)
Received on Thu Feb 3 08:07:32 2005