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 :

copie d'une structure xml avec suppression de certains noeuds


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Homme Profil pro
    éditeur
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : éditeur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut copie d'une structure xml avec suppression de certains noeuds
    Bonjour à tous,

    débutant en xml, je butte sur la transformation suivante: mon fichier xml d'origine, il s'agit d'un exemple de chronologie historique :
    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
    38
    39
    40
    41
    42
    43
    44
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
    	<title>Chrono</title>
    	<meta http-equiv="content-type" content="text/xml" charset="iso-8859-1"/>
    </head>
    <body>
    <!-- Contenu -->
     
    <p style="margin-left:2.75pt;tab-stops:41.5pt 72.0pt">
    	<a name="RANGE!A1:B12">
    		<b>
    			<span style="font-size:8.0pt;font-family:Arial; color:#FF9900">-15 000 000 000</span>
    		</b>
    	</a>
    	<b>
    		<span style="font-size:8.0pt; font-family:Arial;color:#FF9900">
    			<span style="mso-spacerun:yes"></span>
    			<PersonName ProductID="LA PREHISTOIRE" st="on">LA PREHISTOIRE</PersonName>
    		</span>
    	</b>
    	<span style="font-size:8.0pt; font-family:Arial;color:fuchsia"/>
    </p>
     
    <p style="margin-left:2.75pt;tab-stops:41.5pt 72.0pt">
    	<b>
    		<span style="font-size:8.0pt;font-family:Arial">1994<span style="mso-spacerun:yes"></span></span>
    	</b>
    	<span style="font-size: 8.0pt;font-family:Arial">23 février Entrée en vigueur de la loi Toubon.</span>
    </p>
     
    <p style="margin-left:2.75pt;tab-stops:41.5pt 72.0pt">
    	<b>
    		<span style="font-size:8.0pt;font-family:Arial;color:fuchsia">1994
    			<span style="mso-spacerun:yes"></span>
    		</span>
    	</b>
    	<span style="font-size: 8.0pt;font-family:Arial;color:fuchsia">
    		le 14 octobre <u>écrivain contemporain</u>, de langue arabe.
    	</span>
    	<span style="font-size:8.0pt; font-family:Arial"> </span>
    </p>
    </body>
    </html>
    Mon objectif est d'obtenir un fichier xml récupérant les contenus textuels intégralement et structuré comme suit avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <chrono>
    	<evt>équivalent à un élément p du fichier d'origine
    		<date/>se trouve toujours dans le premier élément b de p
    		<titre/>capture des 100 premiers caractères (ou moins s'ils sont en nombre inférieur) du contenu textuel de p
    		<texte1/> le contenu textuel de p dans son intégralité (sans toutes les balises u, b, span, PersonName bien sur)
    	</evt>
    </chrono>
    Pour ce qui est de mes essais infructueux, outre la création de la transformation je pense avoir de gros soucis de compréhension des chemins de localisation ce qui n'arrange pas l'affaire. Par exemple, je n'ai jamais réussi... :
    - A ne renvoyer que le contenu textuel des éléments <u> en bas de l'arborescence sans troubler le reste de la structure on amont ?
    - A en faire autant pour <PersonName>, <span> et <b> et ainsi épurer la capture de l'élément <p> comme je le souhaite.
    - A aménager avec des xsl:if ou xsl:choose la règle de copy par défaut afin d'affiner la capture des noeuds en même temps (conserver les éléments jusqu'aux <p> mais supprimer ensuite les éléments-fils en profondeur, tout en conservant leur contenu textuel.
    - A comprendre les priorités de traitement, certaines règles semblant neutraliser les autres.
    ...[/LIST]

    Un grand merci d'avance pour toute suggestions de transformation réussie sur la base de cet exemple... Et peut-être quelques sources didactiques efficaces sur les chemins de localisation.

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Pour ce qui est de mes essais infructueux, outre la création de la transformation je pense avoir de gros soucis de compréhension des chemins de localisation ce qui n'arrange pas l'affaire.
    Il vaut mieux faire étudier la base, plus élémentaire, plutôt que lancer tout de suite sur les cas avec beaucoup de complications.

    Par exemple, je n'ai jamais réussi... :
    - A ne renvoyer que le contenu textuel des éléments <u> en bas de l'arborescence sans troubler le reste de la structure on amont ?
    Cela a l'air simple mais pas si simple au final si on n'est pas bien initié à la façon de raisonner dans un langage déclaratif comme xslt. Je peux vous montrer comment faire dans ce cas; comme ça, vous avez quelque chose de concrète à saisir. Voilà comment faire.
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
        exclude-result-prefixes="xhtml"
    >
    <xsl:output method="xml" encoding="iso-8859-1" omit-xml-declaration="no" indent="yes" />
    <xsl:template match="/">
        <results>
            <xsl:for-each select="//xhtml:u">
                <value><xsl:value-of select="." /></value>
            </xsl:for-each>
        </results>
    </xsl:template>
    </xsl:stylesheet>

  3. #3
    Candidat au Club
    Homme Profil pro
    éditeur
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : éditeur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup Tsuji,
    en effet, il ne faut pas bruler les étapes. Mais ce petit bout de code en dit long : l'exclusion de l'espace de noms xhtml, l'appel de la déclaration... Si j'ai bien compris, comme l'emploi du namespace neutralisé ne renvoi que du vide, l'inverse permet de capturer la valeur tout en éliminant l'élément (du fait de l'attribut d'exclusion), élément que je peux à l'occasion remplacer. Ca marche...
    J'ai une question dans la question : est-ce bien l'emploi de l'attribut d'exclusion qui libère la possibilité de créer une nouvelle structure dans le document final ? Pendant mes "essais xslt infructueux", je n'ai jamais pu changer les noms des balises (p, span...) ou créer de nouveaux éléments (evt, date...) et les voir insérés dans le résultat.
    Merci encore

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Mais ce petit bout de code en dit long : l'exclusion de l'espace de noms xhtml, l'appel de la déclaration... Si j'ai bien compris, comme l'emploi du namespace neutralisé ne renvoi que du vide, l'inverse permet de capturer la valeur tout en éliminant l'élément (du fait de l'attribut d'exclusion), élément que je peux à l'occasion remplacer.
    Méfiez-vous tout ça ... ça sorte d'imagination : si je dis ça c'est que je ne veux pas que vous n'appreniez des choses d'un angle erroné, et c'est grave. Si l'attribute exclude-result-prefixes vous donne toute sorte d'élan d'imagination, je dirais simplement il ne neutralise de rien du tout, ce n'est pas son but. Il ne fonctionne que au temps d'émittance du résultat de transformation tandis que la déclaration de namespace xmlns:xhtml fonctionne tout le temps. L'exclusion veut dire que si le résultat final ne dépend plus, rien de rien, de namespace préfixé par xhtml, le transformeur n'écrit pas cette déclaration sur le résultat sortant, et c'est tout. C'est presque comme un "sweetener" syntactique. Même le transformeur retourne une déclaration de xmlns:xhtml="..." dans le résultat retourné, ça ne change de rien du tout la sémantique du document sortant au sens xml. C'est un peu abstract pour le mement; mais le temps viendra que vous allez comprendre.

    J'ai une question dans la question : est-ce bien l'emploi de l'attribut d'exclusion qui libère la possibilité de créer une nouvelle structure dans le document final ? Pendant mes "essais xslt infructueux", je n'ai jamais pu changer les noms des balises (p, span...) ou créer de nouveaux éléments (evt, date...) et les voir insérés dans le résultat.
    Et c'est encore la mésinterprétation. Pour créer d'un élément dans le document sortant, il n'y a presque pas la distinction de vieux et de nouveau - mais je comprends ce que vous voulez dire - on s'en sert un constructeur, soit de l'élément, soit de l'attribute ou d'autres. Le constructeur, c'est simplement tout bêtement <results> ... </results> ou bien plus formellement <xs:element name="results"> ... </xs:element>. Il peut avoir plus d'élaboration, mais en gros c'est ça.

  5. #5
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Encore comme une invitation du monde xslt, je peux vous montrer comme faire tout ça. Cette fois je laisse tomber l'attribut exclude-result-prefixes, il n'a pas d'importance et vous voyez vous-même l'effet. Et j'écris le préfixe comme x pour éviter tout malentendu possible : le préfixe n'a rien de nécessité de s'écrire comme xhtml qui invite naturellement à faire une illusion à xhtml comme on entend dans certain contexte.
    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
    22
    23
    24
    25
    26
    27
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:x="http://www.w3.org/1999/xhtml">
    <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="no" indent="yes" />
     
    <!-- mettre 10 au lieu de 50, juste pour voir plus clair dans cet écantillon -->
    <xsl:param name="len" select="10" />
     
    <xsl:template match="/">
        <xsl:apply-templates select="*" />
    </xsl:template>
    <xsl:template match="x:html">
        <chrono>
            <xsl:apply-templates select="x:body/x:p" />
        </chrono>
    </xsl:template>
    <xsl:template match="x:p">
        <evt>
            <!-- first b (not necessarily direct child of p, certain est un enfant indirect, c'est pourquoi //x:b -->
            <date><xsl:value-of select="normalize-space(.//x:b[1])" /></date>
            <xsl:variable name="s">
                <xsl:copy-of select=".//text()" />
            </xsl:variable>
            <titre><xsl:value-of select="substring(normalize-space($s),1,$len)" /></titre>
            <text1><xsl:value-of select="normalize-space($s)" /></text1>
        </evt>
    </xsl:template>
    </xsl:stylesheet>
    Après ça, vous faites l'éffort lisant les tutos avec plus de focus vous-même pour remplir les lacunes qui ne font pas évidentes tout de suite.

Discussions similaires

  1. [Structure] Aide sur une structure XML (et le vocabulaire associé)
    Par projetdk40 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 14/02/2007, 10h38
  2. Traitement d'une structure XML qui change
    Par moook dans le forum Modules
    Réponses: 6
    Dernier message: 17/10/2006, 14h24
  3. Recherche dans une structure XML::Simple
    Par nicolargo dans le forum Modules
    Réponses: 1
    Dernier message: 04/09/2006, 19h17
  4. [xml]Conversion d'une structure xml en csv
    Par cchatel2000 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 01/08/2005, 16h00
  5. Enlver un noeud dans une structure XML
    Par Sharingan dans le forum ASP
    Réponses: 4
    Dernier message: 20/12/2004, 08h08

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