TEI » document (diple_split.xsl, Diple)
© 2010, École nationale des chartes, licence CeCILL-C (LGPL compatible droit français)- [VJ] Vincent Jolivet
- [AG] Anna Gadré
- [FG] Frédéric Glorieux
$_html=".html"
$dir="html/"
paramètre permettant de tester d'où fonctionne un template
$this="tei_split"source
- <xsl:template match="
/"> -
- <xsl:variable name="
href"> -
<xsl:value-of select="
$dir"/>- <xsl:if test="
$bookId != ''"> -
<xsl:value-of select="
$bookId"/> - </xsl:if>
<xsl:value-of select="$_html"/> - <xsl:if test="
- </xsl:variable>
- <xsl:message>
-
<xsl:value-of select="
$href"/> - </xsl:message>
- <xsl:document href="{$href}" omit-xml-declaration="
no" encoding="UTF-8" indent="yes" doctype-public="html"> -
- <html lang="
fr" xml:lang="fr"> -
- <head>
-
- <title>
-
<xsl:call-template name="
title"/> - </title>
<!--lien à une CSS pour les fichiers statiques--> - </head>
- <body class="
nav {$corpusId}"> -
<xsl:call-template name="
nav"/> - </body>
- </html>
- <html lang="
- </xsl:document>
<!--Traverser le document pour voir les documents à créer--><xsl:apply-templates mode="split"/>- <date>
-
<xsl:value-of select="
$date"/> - </date>
<!--le corpus en une seule page ne peut pas être généré ici car le contexte de résolution des liens est différent--> - <xsl:variable name="
- </xsl:template>
<body>, <date>, <head>, <html>, <link>, <script>, <title>, "_", "nav", ", navigation", "//", $dir, $bookId, $_html, $href, $date
Racinesource
- <xsl:template match="
*" mode="href" name="href"> -
- <xsl:choose>
-
<!--
Racine--><!--Structure TEI, renommés par le template "id"-->- <xsl:when test="
local-name(../..)='TEI'"> -
<xsl:call-template name="
id"/><xsl:value-of select="$_html"/> - </xsl:when>
<!--Contient ou est un élément à spliter, spliter-->- <xsl:when test="
descendant-or-self::*[key('split', generate-id())]"> -
<xsl:call-template name="
id"/><xsl:value-of select="$_html"/> - </xsl:when>
<!--Enfant d'une page, id du parent splité + ancre-->- <xsl:when test="
ancestor::*[key('split', generate-id())]"> -
- <xsl:for-each select="
ancestor::*[key('split', generate-id())][1]"> -
<xsl:call-template name="
id"/><xsl:value-of select="$_html"/> - </xsl:for-each>
<xsl:call-template name="id"/> - <xsl:for-each select="
- </xsl:when>
<!--A été rencontré, laissé pour mémoire-->- <xsl:when test="
ancestor::tei:*[local-name(../..)='TEI']"> -
- <xsl:for-each select="
ancestor::tei:*[local-name(../..)='TEI'][1]"> -
<xsl:call-template name="
id"/><xsl:value-of select="$_html"/> - </xsl:for-each>
<xsl:call-template name="id"/> - <xsl:for-each select="
- </xsl:when>
<!--Pas de split, juste des ancres-->- <xsl:otherwise>
-
<xsl:call-template name="
id"/> - </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- </xsl:template>
".", "#", "#", "#", $_html, $_html, $_html, $_html
Réécriture des lienssource
- <xsl:template match="
*" mode="split"> -
<xsl:apply-templates mode="
split"/> - </xsl:template>
source
source
- <xsl:template match="
tei:publicationStmt" mode="split"> -
- <xsl:call-template name="
document"> -
- <xsl:with-param name="
id"> -
- <xsl:if test="
$bookId != ''"> -
<xsl:value-of select="
$bookId"/> - </xsl:if>
- <xsl:if test="
- </xsl:with-param>
- <xsl:with-param name="
- </xsl:call-template>
- <xsl:call-template name="
- </xsl:template>
"_", "licence", $bookId
Licencesource
- <xsl:template match="
/*/tei:text/*" mode="split"> -
<xsl:call-template name="
document"/> - </xsl:template>
source
- <xsl:template match="
/* | /*/tei:text | tei:group/tei:text/tei:body" mode="split" priority="5"> -
<xsl:apply-templates mode="
split"/> - </xsl:template>
source
- <xsl:template match="
tei:titleStmt" mode="split"> -
- <xsl:call-template name="
document"> -
- <xsl:with-param name="
id"> -
- <xsl:if test="
$bookId != ''"> -
<xsl:value-of select="
$bookId"/> - </xsl:if>
- <xsl:if test="
- </xsl:with-param>
- <xsl:with-param name="
- </xsl:call-template>
- <xsl:call-template name="
- </xsl:template>
"_", "credits", $bookId
Créditssource
<xsl:template name="
head"/>source
- <xsl:template match="tei:text | tei:body | tei:front | tei:back | tei:group | tei:div | tei:div0 | tei:div1 | tei:div2 | tei:div3 | tei:div4 | tei:div5 | tei:div6 | tei:div7" mode="
split"> -
- <xsl:choose>
-
<!--
article, créer un document-->- <xsl:when test="key('split', generate-id()) or descendant::*[key('split', generate-id())]">
-
<xsl:call-template name="
document"/> - </xsl:when>
<!--sortir le html-->- <xsl:otherwise>
-
<xsl:apply-templates select="
."/> - </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- </xsl:template>
source
- <xsl:template name="
document"> -
- <xsl:param name="
id"> -
<xsl:call-template name="
id"/> - </xsl:param>
- <xsl:param name="
href"> -
<xsl:value-of select="
$dir"/><xsl:value-of select="$id"/><xsl:value-of select="$_html"/> - </xsl:param>
- <xsl:param name="
title"> -
<xsl:call-template name="
titleBranch"/> - </xsl:param>
<!--Un contenu généré par ailleurs--><xsl:param name="article"/>- <xsl:message>
-
<xsl:value-of select="
$href"/><xsl:call-template name="idpath"/> - </xsl:message>
- <xsl:document href="{$href}" omit-xml-declaration="
no" encoding="UTF-8" indent="yes" doctype-public="html"> -
- <htmlxmlns:dbo="
http://dbpedia.org/ontology/"xmlns:dc="xml:lang="http://purl.org/dc/terms/"fr"> -
- <head>
-
<meta http-equiv="
Content-type" content="text/html; charset=UTF-8"/>- <title>
-
<xsl:value-of select="
normalize-space($title)"/> - </title>
- <xsl:variable name="
label"> -
- <xsl:if test="
ancestor::tei:text[@n]"> -
<xsl:value-of select="
ancestor::tei:text/@n"/> - </xsl:if>
- <xsl:if test="
- </xsl:variable>
<meta name="label" content="{normalize-space($label)}"/><!--lien à une CSS pour les fichiers statiques--><!--Permet ici d'ajouter des metas--><!--Nécessaire pour tous les items, notamment crédits ou licence, qui n'ont pas le titre de corpus dans leur héritage--><!--utile au fil d'ariane, ne pas sortir le body, serait égal à ci-dessus-->- <xsl:for-each select="ancestor::*[ancestor::tei:body or ancestor::tei:group][not(self::tei:body)]">
-
<!--
URI (identifier) suppose flat file-->- <xsl:variable name="
ancestorId"> -
<xsl:call-template name="
id"/> - </xsl:variable>
- <xsl:variable name="
ancestorHref"> -
- <xsl:choose>
-
<!--
@id="bookId_articleId" translate to @href="articleId"-->- <xsl:when test="
contains($ancestorId, concat($bookId, '_'))"> -
<xsl:value-of select="
substring-after($ancestorId, concat($bookId, '_'))"/> - </xsl:when>
- <xsl:otherwise>
-
<xsl:value-of select="
$ancestorId"/> - </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- </xsl:variable>
- <xsl:variable name="
ancestorLabel"> - </xsl:variable>
- <xsl:variable name="
- </xsl:for-each>
- </head>
- <body class="
article {$corpusId}"> -
- <xsl:choose>
-
<!--
Contenu passé en paramètre-->- <xsl:when test="
$article"> -
<xsl:copy-of select="
$article"/> - </xsl:when>
<!--Page d'accueil, ajouter un peu de navigation-->- <xsl:when test="
$id = 'index'"> -
<!--
Procéder les éléments qui ne splitent pas-->- <article>
-
<xsl:call-template name="
atts"/><xsl:apply-templates select="*[not(key('split', generate-id())) and not(descendant::*[key('split', generate-id())])]"/> - </article>
<!--table des matières complète--> - </xsl:when>
<!--avec des enfants à spliter-->- <xsl:when test="
descendant::*[key('split', generate-id())]"> -
<xsl:call-template name="
prevnext"/>- <article>
-
<xsl:call-template name="
atts"/><!--sortir les enfants qui ne sont pas des feuilles de split--><xsl:apply-templates select="*[not(key('split', generate-id()))]"/><!--les notes, passer les noeud sur lesquels générer-->- <xsl:variable name="
notes"> -
- <xsl:call-template name="
notes"> - </xsl:call-template>
- <xsl:call-template name="
- </xsl:variable>
- <xsl:if test="
$notes != ''"> -
- <footer>
-
<xsl:copy-of select="
$notes"/> - </footer>
- </xsl:if>
<!--Sert aussi en cas de section vide--><xsl:text/> - <xsl:variable name="
- </article>
- <ul>
-
- <xsl:choose>
-
- <xsl:when test="
tei:body"> -
- <xsl:for-each select="
tei:body/*[key('split', generate-id())]"> -
- <li>
- </li>
- </xsl:for-each>
- <xsl:for-each select="
- </xsl:when>
- <xsl:otherwise>
-
- <xsl:for-each select="*[ descendant-or-self::*[key('split', generate-id())]]">
-
- <li>
- </li>
- </xsl:for-each>
- <xsl:for-each select="
- </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- </ul>
- </xsl:when>
<!--Feuille de l'arbre à split-->- <xsl:otherwise>
-
- <xsl:variable name="
prevnext"> -
<xsl:call-template name="
prevnext"/> - </xsl:variable>
<xsl:copy-of select="$prevnext"/>- <article>
-
<xsl:call-template name="
atts"/><-- Tester si saut de page en milieu de texte pour récupérer le précédent. Attention, pas .//tei:pb[1] (= tous les pb ainés) ni ./following:: (= saut de page après la section) si du texte avant le premier saut de page, prendre le précédent -->
- <xsl:if test="
.//tei:pb and local-name(*[1])!='pb'"> -
- <xsl:if test=".//text()[count($pb|following::tei:pb[1])=1][normalize-space(.) != '']">
-
<xsl:apply-templates select="
preceding::tei:pb[1]"/> - </xsl:if>
- <xsl:if test="
- </xsl:if>
- <xsl:if test="
$id = 'credits'"> -
<!--
Histoire des modifications (si pas public, mettre display none en CSS)--><xsl:apply-templates select="/*/tei:teiHeader/tei:revisionDesc"/> - </xsl:if>
- <xsl:variable name="
notes"> -
<xsl:call-template name="
notes"/> - </xsl:variable>
- <xsl:if test="
$notes != ''"> -
- <footer>
-
<xsl:copy-of select="
$notes"/> - </footer>
- </xsl:if>
- <xsl:if test="
- </article>
<xsl:copy-of select="$prevnext"/> - <xsl:variable name="
- </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- </body>
- </html>
- <html
- </xsl:document>
<!--Autres sections susceptibles de produire des pages--><xsl:apply-templates select="*[ descendant-or-self::*[key('split', generate-id())] ]" mode="split"/> - <xsl:param name="
- </xsl:template>
<article>, <body>, <footer>, <head>, <hr>, <html>, <li>, <link>, <meta>, <title>, <ul>, " : ", ", ", $article, $notes, $prevnext, $notes, $prevnext, $dir, $id, $_html, $href, normalize-space($title), ancestor::tei:text/@n, substring-after($ancestorId, concat($bookId, '_')), $ancestorId
- $id :
- $href :
- $title :
- $article : Un contenu généré par ailleurs
source
source
- <xsl:template match="
*[tei:num or tei:head/tei:num]" mode="meta"> -
<meta name="
num" content="{normalize-space(tei:num|tei:head/tei:num)}"/> - </xsl:template>
<meta>
Un exemple de surcharge de ce mode pour ajouter des métas spécifiques à un corpussource
- <xsl:template match="tei:div/tei:head | tei:div0/tei:head | tei:div1/tei:head | tei:div2/tei:head | tei:div3/tei:head | tei:div4/tei:head | tei:div5/tei:head | tei:div6/tei:head | tei:div7/tei:head | tei:front/tei:head | tei:back/tei:head | tei:body/tei:head | tei:text/tei:head">
-
<!--
Nombre d'ascendants, s'arrêter à la première page splitée--><xsl:variable name="niv" select="count( ancestor::tei:*[not(descendant::*[key('split', generate-id())]) and local-name()!='front'] )"/>- <xsl:choose>
-
- <xsl:when test="
number($niv) <":" 2"> -
- <h1>
-
<xsl:call-template name="
atts"/> - </h1>
- </xsl:when>
- <xsl:when test="
$niv > 7"> -
- <h6>
-
<xsl:call-template name="
atts"/> - </h6>
- </xsl:when>
- <xsl:otherwise>
-
- <xsl:element name="
h{$niv}"> -
<xsl:call-template name="
atts"/> - </xsl:element>
- <xsl:element name="
- </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- </xsl:template>
<h1>, <h6>, <h{$niv}>
h1 en sommet d'item, et calcul relatif de hiérarchiesource
- <xsl:template name="
prevnext"> -
<xsl:text/>
- <nav class="
prevnext" style="text-align:center;"> -
<xsl:text/>
- <span class="
prev" style="float:left"> -
<-- lien vers l'élément juste avant, même si c'est un petit cousin laisser le test @xml:id, sinon risque d'aller dans des pages qui n'ont pas été générées for-each a l'air moins gourmand qu'un apply-templates PERF : preceding::*[ descendant-or-self::*[key('split', generate-id())]][1] -->
- <xsl:for-each select="
preceding::*[key('split', generate-id())][1]"> -
<xsl:call-template name="
a-label"/> - </xsl:for-each>
<!--Laisser l'espace insécable, si case vide--> - <xsl:for-each select="
- </span>
<xsl:text/>- <span class="
next" style="float:right"> -
- <xsl:variable name="
enfant"> -
- <xsl:for-each select="*[key('split', generate-id()) and local-name()!='body'][1]">
-
- <xsl:call-template name="
a-label"> - </xsl:call-template>
- <xsl:call-template name="
- </xsl:for-each>
- <xsl:for-each select="
- </xsl:variable>
- <xsl:choose>
-
- <xsl:when test="
$enfant != ''"> -
<xsl:copy-of select="
$enfant"/> - </xsl:when>
- <xsl:otherwise>
-
<!--
premier descendant splité (attention à text/body/div[@split])-->- <xsl:variable name="
descendant"> -
- <xsl:for-each select="descendant::*[key('split', generate-id()) and local-name()!='body'][1]">
-
- <xsl:call-template name="
a-label"> - </xsl:call-template>
- <xsl:call-template name="
- </xsl:for-each>
- <xsl:for-each select="
- </xsl:variable>
- <xsl:choose>
-
- <xsl:when test="
$descendant != ''"> -
<xsl:copy-of select="
$descendant"/> - </xsl:when>
<!--suivant-->- <xsl:otherwise>
-
- <xsl:for-each select="
following::*[key('split', generate-id())][1]"> -
- <xsl:call-template name="
a-label"> - </xsl:call-template>
- <xsl:call-template name="
- </xsl:for-each>
- <xsl:for-each select="
- </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- <xsl:variable name="
- </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- <xsl:variable name="
- </span>
<xsl:text/><!--afficher les chapitres parents-->- <xsl:if test="ancestor-or-self::tei:*[@xml:id|tei:head|@id][local-name()!='TEI']">
-
- <div class="
up"> -
- <xsl:for-each select="ancestor-or-self::tei:*[@xml:id|tei:head|@id][local-name()!='TEI']">
-
- <div>
-
- <xsl:call-template name="
a-label"> - </xsl:call-template>
- <xsl:call-template name="
- </div>
- </xsl:for-each>
- <xsl:for-each select="
- </div>
- <div class="
- </xsl:if>
<xsl:text/> - <span class="
- </nav>
<xsl:text/> - <nav class="
- </xsl:template>
<div>, <nav>, <span>, " ", " ", $enfant, $descendant
génération d'une navigation précédent/suivantsource
- <xsl:template match="
*" mode="prev" name="prev-a"> -
<xsl:param name="
secure"/>- <xsl:choose>
-
- <xsl:when test="
not($secure)"> -
- <xsl:apply-templates select="
preceding::*[1]" mode="prev"> - </xsl:apply-templates>
- <xsl:apply-templates select="
- </xsl:when>
- <xsl:when test="
descendant-or-self::*[key('split', generate-id())]"> -
<xsl:call-template name="
a-label"/> - </xsl:when>
<xsl:when test="not(preceding::*[1])"/>- <xsl:otherwise>
-
- <xsl:apply-templates select="
preceding::*[1]" mode="prev"> - </xsl:apply-templates>
- <xsl:apply-templates select="
- </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- </xsl:template>
- $secure :
| preceding | :*[ descendant-or-self::*[key('split', generate-id())] ][1] |
|---|
source
- <xsl:template name="
a-label"> -
<xsl:param name="
rel"/>- <a>
-
- <xsl:attribute name="
href"> -
<xsl:call-template name="
href"/> - </xsl:attribute>
- <xsl:if test="
$rel"> -
- <xsl:attribute name="
rel"> -
<xsl:value-of select="
$rel"/> - </xsl:attribute>
- <xsl:attribute name="
- </xsl:if>
- <xsl:variable name="
t"> - </xsl:variable>
- <xsl:choose>
-
- <xsl:when test="
$title <":" 50"> -
<xsl:value-of select="
$title"/> - </xsl:when>
- <xsl:otherwise>
-
- <xsl:attribute name="
title"> -
<xsl:value-of select="
$title"/> - </xsl:attribute>
<xsl:value-of select="substring($title, 1, 30)"/><xsl:value-of select="substring-before(concat(substring($title, 31), ' '), ' ')"/><!--Quelque chose a été coupé--> - <xsl:attribute name="
- </xsl:otherwise>
- <xsl:when test="
- </xsl:choose>
- <xsl:attribute name="
- </a>
- </xsl:template>
<a>, @href, "…", $rel, $title, $title, substring($title, 1, 30), substring-before(concat(substring($title, 31), ' '), ' ')
- $rel :


Générer la navigation-->