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 :

Déplacement balise dans un élément à contenu mixte


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Déplacement balise dans un élément à contenu mixte
    Bonjour,

    je travaille avec TEI (xml pour textes littéraires) et je voudrais savoir s'il est possible en XSLT de déplacer une balise vide (milestone) à l'intérieur d'un élément à contenu mixte.

    L'exemple est peut-être plus parlant...

    J'ai cela:

    <p>Lorem ipsum dolor sit amet,

    <lb/> consectetur adipiscing elit.

    <lb/> Donec semper com-

    <lb/>modo nunc in fermentum.</p>



    et je voudrais obtenir ceci:

    <p>Lorem ipsum dolor sit amet,

    <lb/> consectetur adipiscing elit.

    <lb/> Donec semper commodo

    <lb/> nunc in fermentum.</p>



    com-<lb/>modo

    devient

    commodo<lb/>



    Est-ce possible avec XSLT 2.0?
    Comment je doit m'y prendre?

    Merci des suggestions,

    GrandVampire

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 565
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Techniquement il s'agit aussi d'enlever le tiret et la fin de ligne. Ce n'est pas seulement déplacer une balise.

    Et c'est possible, oui. Mais pas trop prévu pour, et donc assez lourd.
    Par ailleurs, tu ne nous as pas dit dans quelles conditions tu veux que ce "déplacemenent" arrive : pour quelle raison une balise doit ou ne doit pas être déplacée, et déplacée où ?

    Voici une preuve qu'on peut le faire (en XSLT 1.0, parce que je ne suis pas habitué au 2.0) :

    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
    <xsl:template match="p[contains(., 'Donec semper com-')]">
      <p>
        <!-- prendre une référence vers le nœud texte qui est coupé -->
        <xsl:variable name="splitText" select="text()[contains('Donec semper com-')]"/>
     
        <!-- copier tout ce qui est avant le texte en question -->
        <xsl:copy-of select="$splitText/preceding-sibling::node()"/>
     
        <!-- insérer le texte en question, jusqu'à son tiret de fin, exlcus -->
        <xsl:value-of select="string-before($splitText, '-')"/>
     
        <!-- insérer la fin du mot (texte suivant, jusqu'à l'espace, exclus) -->
        <xsl:value-of select="string-before($splitText/following-sibling::text(), ' ')"/>
     
        <!-- insérer fin de ligne et tabulation, trouvée après le tiret -->
        <xsl:value-of select="string-after($splitText, '-')"/>
     
        <!-- insérer la balise de séparation -->
        <lb/>
     
        <!-- insérer le texte restant -->
        <xsl:value-of select="' '"/>
        <xsl:value-of select="string-after($splitText/following-sibling::text(), ' ')"/>
      </p>
    </xsl:template>
    Donc oui, c'est possible, et oui, c'est atrocement chiant.
    Pour ce genre de choses, j'utiliserais plutôt un autre langage. Java, C#, ce genre de choses.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse thelvin!

    Pour en dire un peu plus, le texte dans <p> est un texte publié sur papier et retranscrit en xml en gardant la mise en forme papier. Le mot "commodo" est à l'origine coupé pour aller à la ligne. Le problème est que certains moteurs de recherche sont capable de trouver "commodo" même coupé, mais d'autres moteurs ne sont pas capables. Pour ces moteurs je suis obligé de recomposer le mot pour qu'il puisse être trouvé.
    C'est bien plus simple avec d'autres langages, et d'ailleurs je traite ces problèmes en Perl, mais j'aurais voulu intégrer ce traitement à une feuille XSLT qui fait déjà pas mal de transformations pour rendre mes fichiers compatibles avec ces moteurs bas de gamme...

    Du coup je crois que ta réponse est un peu trop dépendante de l'exemple pour être appliqué à quelque millier d’occurrences par fichier. Et c'est pour ça que je pensais à un code avec des regex...

    Merci encore

    GrandVampire

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 565
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Si tu peux dire comment reconnaître qu'il y a un mot coupé de cette façon et qu'il faut réparer, alors il y a moyen de faire une solution plus générale. Mais aussi plus compliquée.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/02/2010, 23h10
  2. [JDOM] récupération le contenu de balise dans un tableau de chaînes
    Par soumti84 dans le forum Format d'échange (XML, JSON...)
    Réponses: 14
    Dernier message: 17/06/2009, 21h28
  3. Réponses: 2
    Dernier message: 13/05/2009, 09h19
  4. [RegEx] Récupérer contenu balise dans un tableau
    Par Darkcristal dans le forum Langage
    Réponses: 4
    Dernier message: 13/12/2008, 21h07
  5. Réponses: 8
    Dernier message: 17/05/2007, 19h29

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