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 :

TEI-->HTML : éléments dupliqués


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut TEI-->HTML : éléments dupliqués
    Bonjour à tous,

    Je débute en XSLT sur un travail de conversion d'un texte encodé en TEI vers l'HTML, et je tombe sur un os. Il est possible que ce ne soit pas grand chose, une étourderie, mais j'ai beau réviser, je ne vois pas ce qui coince, et j'ai besoin de regards plus aiguisés sur mon travail.

    A partir d'un texte encodé en TEI, je dois produire une sortie HTML avec autant de sections qu'il y a de pages encodées dans mon fichier TEI. Donc récupérer tout les noeuds, éléments et textes, situés entre deux balises <pb>, qui signalent en TEI le changement de page d'un texte imprimé, de manière à ce que le contenu d'une page encodée dans le fichier TEI se retrouve encapsulé dans une div de class=page en html, au lieu d'être entre deux éléments <pb>

    Pour faire ça, après avoir créé avec l'instruction <xsl:for-each> autant de <div> de type "page" qu'il y a d'éléments <pb> dans mon fichier TEI, j'appelle des règles sur tous les noeuds dans l'intervalle entre le <pb> qui constitue le noeud courant, et le <pb> suivant. Cela donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:for-each select="tei:pb">
    		<div class="page">
    			<xsl:apply-templates select="current()/following::node()[not(preceding::tei:pb[@n>(current()/@n)])]"/>
    		</div>
    </xsl:for-each>
    Et là est le nœud du problème, si je puis dire : la sortie HTML que je produis est encombré d'éléments dupliqués, on ne sait trop pourquoi : je me retrouve avec deux fois le même paragraphe, deux fois le même titre, etc... Les éléments que j'appelle dans ma <div> page se trouvent bien là, ils sont bien interprétés, et là où je les veux, mais en deux ou troix exemplaires chaque. Le problème n'existe pas si j'appelle des règles uniquement sur les nœuds textuels situés dans l'intervalle, mais ça ne m'intéresse pas de perdre les balises incluses dans ces nœuds.

    Les règles que j'appelle sont pourtant tout ce qu'il y a de plus basique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <xsl:template match="text()">
     
    		<xsl:value-of select="."></xsl:value-of>
     
    	</xsl:template>
     
    <xsl:template match="tei:p">
     
    		<p>
    			<xsl:apply-templates/>
    		</p>
     
    </xsl:template>
    etc..

    La structure du document, moins son contenu :

    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
     <pb/>
                <div type="chapter">
                    <head>
                              <ref ></ref>
                    </head>
                     <div type="chapter_intro">
                        <p> </p>
                      </div>
                      <div type="chapter_core">
                        <p>blabla
                                <add type="topic" place="margin-ext">blaaa</add>blabla
                         </p>
     
                      </div>
                </div>
     
                <div type="chapter" n="" xml:id="">
                    <head type="chapter_title"></head>
                    <div type="chapter_core">
                        <floatingText>
                            <body>
                                <div type="img">
                                    <p></p>
                                </div>
     
                                <pb n="" facs=""/>
    J'ai pensé que cela pouvait être un problème concernant certains éléments conteneurs, interprétés d'office, ce qui reproduirait en profondeur toutes les balises contenues. J'ai donc rédigé une template vide pour les <div> de type chapitre, et effectivement, cela a réglé une partie du problème. Mais les éléments <p> ou <head> par exemple sont toujours doublés eux, et je ne peux pas les éliminer avec une template vide, puisque je veux les traduire dans le format de sortie...

    Avez-vous une idée de ce que cela peut être ? Merci en tout cas à ceux qui auront pris la peine de lire ma complainte !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut
    Bon je précise que je connais les méthodes de dédoublonnage, mais là je ne pense pas qu'elles puissent s'appliquer, car je crois avoir compris que les éléments en double sont dupliqués parce qu'ils sont copiés une fois en tant qu'élément indépendant, et la seconde en tant que partie du noeud texte d'une balise enveloppante : c'est le cas pour les éléments <add> par exemple. Lors de la transformation, le texte qu'ils contiennent est une fois placé dans les balises que j'indique dans une template, et une autre fois copié en tant que partie du noeud texte de la balise <p>... or pour dé doublonner on travailler sur des éléments semblables au contenu similaire là c'est pas exactement ça.

    Je comprend pas ce comportement, j'écris une template pour les text(), une autre pour les éléments <add>, les deux boulots devraient normalement se combiner, pas s'additionner.

  3. #3
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Citation Envoyé par Silenzio Voir le message
    je crois avoir compris que les éléments en double sont dupliqués parce qu'ils sont copiés une fois en tant qu'élément indépendant, et la seconde en tant que partie du noeud texte d'une balise enveloppante
    C'est exactement ça, sauf pour les éléments du même niveau que le <pb/>.
    C'est dû à ton appel de template dans le for-each : l'axe following sélectionne tous les noeuds qui suivent le noeud pb, quelle que soit leur niveau dans l'arbre.

    Toi ce que tu veux sélectionner ici, ce ne sont que les éléments frères de pb. Pour celà, il faut utiliser l'axe following-sibling. D'ailleurs, l'axe following n'est quasiment jamais utile dans un traitement. Il faut vraiment faire des transformations très tordues pour l'utiliser.

    Donc normalement, si tu transformes ton code comme ça, ça devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:for-each select="tei:pb">
    	<div class="page">
    		<xsl:apply-templates select="following-sibling::node()[not(preceding-sibling::tei:pb[@n>(current()/@n)])]"/>
    	</div>
    </xsl:for-each>
    Tu pourrais même transformer légèrement ta condition pour que le traitement soit un peu plus rapide et un peu plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:for-each select="tei:pb">
    	<div class="page">
    		<xsl:apply-templates select="following-sibling::node()[preceding-sibling::tei:pb[1]/@n = current()/@n]"/>
    		<!-- ou bien (parce que je ne suis pas sûr que le '[1]' soit le même dans tous les interpréteurs XPath) : -->
    		<xsl:apply-templates select="following-sibling::node()[(preceding-sibling::tei:pb)[last()]/@n = current()/@n]"/>
    	</div>
    </xsl:for-each>

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut
    Bonjour et merci de ta réponse ! Alors j'ai essayé ta solution, et en effet ça résout le problème du doublonnage... Par contre, les intervalles entre éléments <pb> ne sont pas reproduits (ex : dans la structure que j'ai publiée précédemment, la première div page englobe allégrement au delà du second <pb>), mais là c'est un autre problème.

    Le problème peut-il venir de la position totalement aléatoire du <pb> dans la hiérarchie du code ? il peut aussi bien se trouver intégré à l'intérieur d'un paragraphe qu'au niveau d'un élément encapsulant de niveau supérieur de type chapitre.

  5. #5
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    S'ils ne sont pas tous au même niveau, ça pose effectivement problème, et pas qu'un peu !

    Pour le coup il faut effectivement utiliser following:: et preceding:: mais, actuellement, je ne vois pas de solution simple à mettre en place.

  6. #6
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Il vaut mieux si vous montrez (figurativement, avec toutes les structures de détail préservées) le TEI document et comment vous voulez le html resemble, y compris les détails sur les namespaces aussi. Comme ça on peut vous aider plus effectivement. Ce n'est si simple pour ceux qui débutent.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut
    Bon j'ai continué à réfléchir à mon petit problème, et j'en suis arrivé à la conclusion que je ne m'en sortirai pas sans simplifier en premier lieu la structure logique du document, en enlevant des nœuds encapsulant inutiles, et, surtout, en modifiant la position des éléments bornes, de manière qu'ils se situent à la même place dans le document qu'en ce moment, mais à un niveau de la hiérarchie qui ne produise plus de problème pour la sélection d'intervalle.

    Par conséquent, le problème est modifié : il ne s'agit plus de sélectionner tous les nœuds dans un intervalle -enfin si, mais pas en premier-, mais tout d'abord de rédiger une feuille de style qui fasse remonter automatiquement l'élément borne dans la hiérarchie des éléments, tout en fermant toutes les balises dont il était fils. En clair, faire ça -la balise borne à faire remonter est l'élément <pb> :

    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
    avant:
     
    <p>blah blah blah <pb/> blah blah blah</p>
    <list>
            <item>blah blah blah blah</item>
            <item>blah blah <pb/>blah blah</item>
            <item>blah blah blah blah</item>
    </list>
     
    après:
     
    <p>blah blah blah </p>
    <pb/>
    <p> blah blah blah</p>
    <list>
            <item>blah blah blah blah</item>
            <item>blah blah </item>
    </list>
    <pb/>
    <list>
            <item>blah blah</item>
            <item>blah blah blah blah</item>
    </list>
    Ce qui éviterait, dans la sélection des nœuds entre chaque balise <pb>, de rencontrer les problèmes de chevauchement qui me causent des soucis en ce moment. Mais là, comme ça, je ne sais pas comment faire. Apparemment c'est possible, car j'ai vu quelqu'un sur un forum montrer l'exemple précédent en disant y être parvenu, mais il omettait de préciser comment. Si quelqu'un a une idée pour la rédaction d'une règle qui fermerait automatiquement toutes les balises ouvertes avant un élément <pb>, de manière à ce que celui-ci se retrouve toujours à un niveau supérieur...

  8. #8
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Ce n'est pas forcément plus simple.

    Très franchement, j'ai un peu réfléchi à ton problème et je ne vois pas de solution simple.
    Très certainement, d'autres ont déjà eu à résoudre ça (typiquement, XSL-FO le fait) donc tu auras peut-être des pistes sur d'autres posts, mais sinon je sèche.

Discussions similaires

  1. Wordpress, Html, élément dynamique
    Par tom_6821 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 12/12/2012, 15h54
  2. [HTML] élément de liste qui est un lien
    Par pepper18 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 12/02/2008, 10h33
  3. Définir un élément HTML au dessus d'un autre
    Par genova dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/12/2005, 19h55
  4. [HTML][CSS]Décalage vertical entre éléments d'un tableau IE
    Par toctof dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/09/2005, 15h50
  5. [HTML/CSS]désigner un élément dans un tableau de l'extérieur
    Par FrankOVD dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/06/2005, 21h55

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