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
-->