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][Débutant]Répertorier des éléments


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut [XSLT][Débutant]Répertorier des éléments
    Voilà mon problème, j'ai un fichier xml de ce type :

    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
    <library>
      <component name="author">
        <name>...</name>
        <surname>...</surname>
      </component>
      <component name="researcher">
        <name>...</name>
        <surname>...</surname>
        <university>...</university>
      </component>
      <component name="book">
        <title>...</title>
        <use types="author researcher"/>
      </component>
    </library>
    <body>
      <use types="book"/>
    </body>
    et j'aimerais obtenir, via une transformation xslt le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <body>
      <component name="book">
        <title>...</title>
        <component name="author">
          <name>...</name>
          <surname>...</surname>
        </component>
        <component name="researcher">
          <name>...</name>
          <surname>...</surname>
          <university>...</university>
       </component>
      </component>
    </body>
    Concrètement je voudrais répertorier tous les COMPONENT que je trouve dans la LIBRARY et les placer là où ils sont effectivement utilisés dans le BODY. Je suis débutant en XSLT et je voulais déjà savoir si cela est faisable, est-ce que je prend le problème par le bon bout et avez vous des solutions à me proposer. Merci d'avance pour votre aide.

    -
    Petite précision encore, on ne connaît pas à l'avance les attributs name des COMPONENT.

  2. #2
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Ma façon de penser n'était pas correct je pense, j'essaye de procéder comme ça à présent :
    je tombe sur un élément USE, je sépare les types et vais les chercher dans la library, comme ça :

    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
    <xsl:template match="use">
      ...
      <xsl:call-template name="treat_types">
        <xsl:with-param name="list" select="attribute::types" />
      </xsl:call-template>
      <xsl:call-template name="treat_element"/> <!-- s'occupe de continuer la création de l'arbre xml -->
    </xsl:template>
     
    <xsl:template name="treat_types">
      <xsl:param name="list" />
      <xsl:variable name="newlist" select="concat(normalize-space($list), ' ')" />
      <xsl:variable name="first" select="substring-before($newlist, ' ')" />
      <xsl:variable name="remaining" select="substring-after($newlist, ' ')" />
      <xsl:call-template name="library_elements">
        <xsl:with-param name="name" select="$first" />
      </xsl:call-template>
      <xsl:if test="$remaining">
        <xsl:call-template name="treat_types">
          <xsl:with-param name="list" select="$remaining" />
        </xsl:call-template>
      </xsl:if>
    </xsl:template>
     
    <xsl:template name="library_elements">
      <xsl:with-param name="name"/>
      <xsl:for-each select="/library/component[@name='{$name}']">
        <xsl:apply-templates select="."/>
      </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="component">
      ...
      <xsl:call-template name="treat_element"/> <!-- s'occupe de continuer la création de l'arbre xml -->
    </xsl:template>
    Mais ça ne fonctionne pas.... selon mon moteur xsl :
    xsltApplyOneTemplate: problem with xsl:with-param
    Une idée sur ce qui est faux dans mon code ?

  3. #3
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Ok, il y avait juste une erreur de syntaxe là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:template name="library_elements">
      <xsl:param name="name"/>
      <xsl:for-each select="/library/component[@name=$name]">
        <xsl:apply-templates select="."/>
      </xsl:for-each>
    </xsl:template>
    Ca fonctionne !!

  4. #4
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    peut être un peu plus concis ?
    xml d'entrée
    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
    <r>
    	<library>
    		<component name="author">
    			<name>a</name>
    			<surname>a</surname>
    		</component>
    		<component name="researcher">
    			<name>b</name>
    			<surname>b</surname>
    			<university>b</university>
    		</component>
    		<component name="book">
    			<title>c</title>
    			<use types="author researcher"/>
    		</component>
    	</library>
    	<body>
    		<use types="book"/>
    	</body>
    </r>
    xslt
    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
    <?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="/">
    		<body>
    			<xsl:for-each select="/*/body/use">
    				<xsl:call-template name="parcours">
    					<xsl:with-param name="liste" select="normalize-space(@types)"/>
    				</xsl:call-template>
    			</xsl:for-each>
    		</body>
    	</xsl:template>
    	<xsl:template match="component">
    		<xsl:copy>
    			<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
    			<xsl:copy-of select="*[name()!='use']"/>
    			<xsl:call-template name="parcours">
    				<xsl:with-param name="liste" select="normalize-space(use/@types)"/>
    			</xsl:call-template>
    		</xsl:copy>
    	</xsl:template>
    	<xsl:template name="parcours">
    		<xsl:param name="liste"/>
    		<xsl:choose>
    			<xsl:when test="contains($liste,' ')">
    				<xsl:apply-templates select="/*/library/component[@name=substring-before($liste,' ')]"/>
    				<xsl:call-template name="parcours">
    					<xsl:with-param name="liste" select="substring-after($liste,' ')"/>
    				</xsl:call-template>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:apply-templates select="/*/library/component[@name=$liste]"/>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>
    xml de sortie
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <body>
    	<component name="book">
    		<title>c</title>
    		<component name="author">
    			<name>a</name>
    			<surname>a</surname>
    		</component>
    		<component name="researcher">
    			<name>b</name>
    			<surname>b</surname>
    			<university>b</university>
    		</component>
    	</component>
    </body>

  5. #5
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Nickel, merci pour l'optimisation

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

Discussions similaires

  1. [Débutant] Placement des éléments dans mon layout
    Par rsuinux dans le forum Composants graphiques
    Réponses: 6
    Dernier message: 01/05/2015, 16h07
  2. Débutant : extraire des éléments d'une Listbox
    Par DUDE007 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 05/03/2011, 15h53
  3. [débutant] Somme des éléments d'un tableau
    Par Kazuhiko$ dans le forum Caml
    Réponses: 5
    Dernier message: 19/11/2008, 11h29
  4. [XSLT] Changer le nom des éléments...
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 14/11/2005, 11h00
  5. [xslt] Suppression des éléments sans contenu.
    Par dibbouk dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/06/2005, 17h17

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