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 !