IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

translate ---> @ attribut


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut translate ---> @ attribut
    Salut tout le monde,
    Ce code me permet de filtrer des source xhtml pour récupérer la partie qui m'intérèsse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="//body//table[3]">
      <xsl:copy-of select="."/>
    </xsl:template>
    Problème, je dois effectuer un translate dans les valeurs d'attributs <img src="nom.txt"> en <img src="nom.jpg">
    j'essay avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="//body//table[3]">
      <xsl:copy-of select="*[translate(@*, '.txt', '.jpg')]"/>
    </xsl:template>
    sans résultat
    en plus je dois éliminer du résultat tout les <a href...>
    quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="//body//table[3]">
      <xsl:copy-of select="*[translate(@*, '.txt', '.jpg')][not(a)]"/>
    </xsl:template>
    merci pour votre aide

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    pour réussir l'écriture de tes expressions XPath, il est important de bien comprendre la chose suivante : Les expressions entre crochets ne servent pas à faire des opérations sur des noeuds mais sont des prédicats. Les prédicats servent à filtrer des éléments parmi ceux sélectionnés dans l'expression XPath qui les précèdent. Le prédicat est évalué pour chaque noeud de la sélection, et si l'expression qui le compose renvoie true, le noeud est conservé, sinon il est filtré.

    Exemples de requêtes XPath avec ou sans prédicats :

    Sélectionne tous les éléments table de la source XML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //table[@class = 'liste']
    Ne sélectionne que les éléments table qui ont un attribut class qui contient la valeur 'liste'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //table[starts-with(@class, 'l')]
    Ne sélectionne que les éléments table qui ont un attribut class dont la valeur commence par un 'l' (starts-with renvoie un booléen)

    Quand le prédicat ne contient qu'un chiffre k, alors l'expression XPath ne renvoie que le k-ième noeud de la sélection ; ce type particulier de prédicat est un raccourci pour le prédicat [position() = k], et peut être associé à un autre prédicat. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //table[@class='liste'][4]
    Ne sélectionne que le quatrième élément parmi les éléments table ayant un attribut class avec une valeur égale à 'liste'

    Attention à l'ordre des prédicats, il ne faut pas confondre avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //table[4][@class='liste']
    sélectionne la quatrième table de la source XML uniquement s'il a un attribut class avec la valeur 'liste'
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    merci Grand-Father pour ta réponse
    effectivement les crochets servent de prédicats
    une erreur de ma part dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:copy-of select="*[translate(@*, '.txt', '.jpg')]"/>
    mais comment faire pour le translate
    merci pour ton aide

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Le translate ne convient pas, cette fonction ne travaille qu'au niveau caractère, pas de la chaîne. Il vaut mieux utiliser substring-before(). Comme tu dois faire un traitement sur certaines balises avant de les recopier, le <xsl:copy-of> ne convient pas pour ton problème. Il faut créer un template "général" qui se charge de recopier tel quel les balises sans modifications, et des templates pour chaque cas particulier qui nécessite une transformation. Ca donne grosso modo ceci (à toi d'adapter à ton cas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<xsl:template match="/">
    		...
    		<xsl:apply-templates select="//body//table[3]"/>
    		...
    	</xsl:template>
     
    	<xsl:template match="*">
    		<xsl:copy>
    			<xsl:copy-of select="@*"/>
    			<xsl:apply-templates/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="img">
    		<img src="{concat(substring-before(@src, '.'), '.jpg')}">
    			<xsl:apply-templates/>
    		</img>
    	</xsl:template>
     
    	<xsl:template match="a"/>
     
     
    </xsl:stylesheet>
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    yos
    yos est déconnecté
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 140
    Points : 60
    Points
    60
    Par défaut
    Merci Grand-father C ok

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'attribut à l'élément "Body"
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 07/04/2003, 15h52
  2. Filtre d'affichage de balise selon leur attributs
    Par Norely dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 03/04/2003, 14h33
  3. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39
  4. Lire un attribut dans un fichier XML en C++
    Par ti.k-nar dans le forum XML
    Réponses: 2
    Dernier message: 14/10/2002, 15h22
  5. comment changer d'attribut de fonte dans un Tlabel?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 21/08/2002, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo