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] Balise englobante


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Points : 21
    Points
    21
    Par défaut [XSLT] Balise englobante
    Bonjour dans le cadre d'un entrainement sur les feuilles de transformatioon je dois passer de ce dérivé de SVG créé pour l'occasion,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        <object ref="canard">
          <origin x="200" y="312"/>
          <style>
            <stroke>
              <color>green</color>
              <width>2</width>
            </stroke>
            <fill>red</fill>
          </style>
          <transform type="rotate">-50</transform>
          <transform type="scale">0.5</transform>
        </object>
    à du SVG pur,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            <g transform="scale(0.5)">
                    <g transform="rotate(-50)">
                            <use x="200" y="312" xlink:href="#canard"
                                    style="fill: red; stroke: green; stroke-width: 2;"/>
                    </g>
            </g>
    J'ai déjà réalisé le template s'appliquant sur object,
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
        <xsl:template match="object">
            <use>
                <xsl:attribute name="x"><xsl:value-of select="origin/@x"/></xsl:attribute>
                <xsl:attribute name="y"><xsl:value-of select="origin/@y"/></xsl:attribute>
                <xsl:attribute name="xlink:href"><xsl:value-of select="concat('#',@ref)"/></xsl:attribute>
                <xsl:attribute name="style"><xsl:apply-templates select="style"/></xsl:attribute>
            </use>        
        </xsl:template>
     
        <xsl:template match="style">
            <xsl:apply-templates select="stroke"/>
            <xsl:choose>
                <xsl:when test="count(fill)>0">
                    <xsl:text>fill: </xsl:text>
                    <xsl:value-of select="fill"/>
                    <xsl:text>; </xsl:text>
                </xsl:when>
            </xsl:choose>
        </xsl:template>
     
        <xsl:template match="stroke">
            <xsl:choose>
                <xsl:when test="count(color)>0">
                    <xsl:text>stroke: </xsl:text>
                    <xsl:value-of select="color"/>
                    <xsl:text>; </xsl:text>
                </xsl:when>
            </xsl:choose>
            <xsl:choose>
                <xsl:when test="count(width)>0">
                    <xsl:text>stroke-width: </xsl:text>
                    <xsl:value-of select="width"/>
                    <xsl:text>; </xsl:text>
                </xsl:when>
            </xsl:choose>
        </xsl:template>
    mais comme vous pouvez le voir, je ne m'occupe pas encore de la balise "transform". Dans le premier schéma celle-ci est à l'intérieur de "object" alors qu'en SVG, elle l'englobe.
    C'est sur ce dernier point que je viens demander conseil, auriez-vous une manière élégante d'effectuer cette transformation, sachant que "transform" peut apparaitre un nombre quelconque de fois, 0 inclus? Mes diverses tentatives en récursif me semble très sales.

  2. #2
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Salut,

    C'est rigolo, sur mon projet, j'ai le même problème que toi
    La seule solution que j'ai trouvé est de stocker les noeuds ainsi créés dans une variable qui est passée en paramètre du template de la balise "englobante" dans le SVG (ie le <g>), qui s'occupera de les ajouter au bon endroit.

    Si quelqu'un a mieux, je suis preneur aussi.

    Bonne soirée

  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,

    il est possible de s'en sortir avec de simples templates, avec une utilisation judicieuse des modes et des axes XPath :
    Code XSLT : 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
    <xsl:template match="object">
      <xsl:apply-templates select="transform[last()]|self::object[not(transform)]" mode="use" />
    </xsl:template>
     
    <xsl:template match="transform" mode="use">
      <g>
        <xsl:attribute name="transform"><xsl:value-of select="concat(@type, '(', ., ')')"/></xsl:attribute>
        <xsl:apply-templates select="(preceding-sibling::transform|parent::object)[last()]" mode="use"/>
      </g>
    </xsl:template>
     
    <xsl:template match="object" mode="use">
      <use>
        <xsl:attribute name="x"><xsl:value-of select="origin/@x"/></xsl:attribute>
        <xsl:attribute name="y"><xsl:value-of select="origin/@y"/></xsl:attribute>
        <xsl:attribute name="xlink:href"><xsl:value-of select="concat('#',@ref)"/></xsl:attribute>
        <xsl:attribute name="style"><xsl:apply-templates select="style"/></xsl:attribute>
      </use>        
    </xsl:template>
     
    ...

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Points : 21
    Points
    21
    Par défaut
    Merci de ton aide, je ne m'attendais pas à ce qu'une solution aussi élégante et compacte puisse exister. Voilà de quoi me faire travailler les notions d'axe et de mode.

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

Discussions similaires

  1. [XSLT]balises meta
    Par Crazyfaboo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 04/07/2007, 14h06
  2. [XSLT] Balises conditionnelles
    Par ploxien dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 23/11/2006, 16h30
  3. [XSLT] Balise issue d'une variable
    Par ploxien dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 22/11/2006, 14h20
  4. [XSLT] Balise for-each et caractères spéciaux
    Par Guilbert69 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 09/10/2006, 11h37
  5. [.NET][XSLT] balise META
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/05/2005, 11h35

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