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 :

[XSLT] Transformation contextuelle


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut [XSLT] Transformation contextuelle
    Salut,

    (Désolé pour le titre, mes connaissances d'XSLT sont des plus rudimentaires, et ce que je cherche à faire correspond vaguement à un global/pattern/substitute/autre-pattern/texte-de-remplacement/ (pour ceux qui connaissent sed/vim))

    Mon but est de remplacer certains tableaux dans un document par autre chose, et de laisser tout le reste inchangé. En piquant, et retouchant, des morceaux de code à droite à gauche, j'ai trouvé de quoi copier sans altérer, et de quoi reconnaitre mes tableaux. Ou presque.
    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
    <!-- convert.xsl --> 
    ...
    	<!-- ==========================[ Rules tables ]=========================== -->
    	<xsl:template match="//informaltable/tgroup[@cols=2]/tbody">
    		foo
    	</xsl:template>
     
    	<!-- ==========================[ Identity ]=============================== -->
    	<xsl:template match="@*">
    		<xsl:copy />
    	</xsl:template>
     
    	<xsl:template match="*">
    		<xsl:copy>
    			<xsl:apply-templates select="* | text() | @*"/>
    		</xsl:copy>
    	</xsl:template>
    Seul problème, c'est que les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <informaltable frame="all">
      <tgroup cols="2">
        <tbody>
          <row>
            bar 
          </row>
        </tbody>
      </tgroup>
    </informaltable>
    sont transformés en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <informaltable frame="all">
      <tgroup cols="2">
        foo
      </tgroup>
    </informaltable>
    alors que j'aurais voulu tout dégager depuis les <informaltable/> (seulement dans ce cas de "cols=2", et de une seule balise <row/> si possible)
    Je soupçonne que mes problèmes viennent que <informaltable/> est matché par la règle générique.


    Il y a-t-il un moyen simple de dire "l'ensemble de la table si elle est reconnue" ?

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Bon. Après investigations, j'ai pondu ce qui suit, et qui me parait assez sale comme façon de procéder.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!-- ==========================[ Rules tables ]=========================== -->
    <!-- <xsl:template match="//informaltable/tgroup[@cols=2]/tbody"> -->
    <xsl:template match="informaltable">
    	<xsl:choose>
    		<xsl:when test="./tgroup[@cols=2]/tbody">
    			foo
    		</xsl:when>
    		<xsl:otherwise>
    			<xsl:copy>
    				<xsl:apply-templates select="@*|*|text()"/>
    			</xsl:copy>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
    Aurais-je manqué quelque chose de plus propre ?

  3. #3
    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,

    effectivement, ton pattern ne "matche" que les éléments <tbody>, les <informaltable> étant traités en amont par le template générique. Il faut modifier ton pattern ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="informaltable[tgroup/@cols=2 and count(tgroup/tbody/row)=1]">
      foo
    </xsl:template>

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Magnifique! (hop, maintenant la transformation du contenu...)

    J'étais passé à côté de cette subtilité relative aux spécifications de chemins.
    Merci!

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

Discussions similaires

  1. [XSLT]Transformation d'images
    Par boleduch dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/10/2005, 14h03
  2. [XSLT]Transformer une partie d'un document
    Par Floyd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/10/2005, 14h03
  3. [XML][XSLT] transformer le xml en binaire via une xslt
    Par chama dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/07/2005, 11h42
  4. [XSLT] transformation XHTML->XML
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 23/05/2005, 13h15
  5. [XSLT] transformation XML->XML en php
    Par amellouki dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 03/03/2005, 12h32

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