Relevé des signatures
1°) Saisir ci-dessous (entre les balises "xml") :
<xml>A-Q4 Aa-Zz2</xml>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<!--Fichier pour générer les signatures à partir des collations-->
<xsl:output method="text" encoding="UTF-8" version="1.0"
xmlns="http://www.tei-c.org/ns/1.0"/>
<xsl:template match="/">
<xsl:variable name="pass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:variable name="pass2">
<xsl:for-each select="$pass1">
<xsl:apply-templates mode="pass2"/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="pass3">
<xsl:for-each select="$pass2">
<xsl:apply-templates mode="pass3"/>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="$pass3">
<xsl:apply-templates mode="pass4"/>
</xsl:for-each>
</xsl:template>
<!--copie 1 : tout contenu et balisage-->
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="* | comment() | text()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|processing-instruction()|comment()">
<xsl:copy/>
</xsl:template>
<!--copie 2 : tout contenu et balisage-->
<xsl:template match="*" mode="pass2">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*|processing-instruction()|comment()|text()"
mode="pass2"/>
</xsl:copy>
</xsl:template>
<!--copie 3 : tout contenu et balisage-->
<xsl:template match="*" mode="pass3">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*|processing-instruction()|comment()|text()"
mode="pass3"/>
</xsl:copy>
</xsl:template>
<!--copie 4 : tout contenu et balisage-->
<xsl:template match="*" mode="pass4">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*|processing-instruction()|comment()|text()"
mode="pass4"/>
</xsl:copy>
</xsl:template>
<!--Passage 1-->
<!--exemple :
[270](i.e. 256) f.(sig. ã-ĩ4 õ2)
1°) \[(\d+)\] =>270 dans [270] => <folio>
4°) ((\(i\.e\.|\(=)?\s?(\d+)\))? =>256 dans (i.e. 256) => <corr>
5°) (f\.\(sig\. etc. => f.(sig. ã-ĩ4 õ2) => <cahier> contenant <lettre> et <nb> -->
<xsl:template match="xml">
<xml><xsl:analyze-string select="." regex="(\s?(([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+-([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+(\d)|\s?([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+(\d))+)">
<xsl:matching-substring>
<sig>
<!--Si ensemble régulier de cahier marqué par un tiret.
Ex : ã-ĩ4
1°) (([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+) => ã => <lettre>
3°) (([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+) => ĩ => <lettre>
5°) (\d+) => 4 => <nb>
-->
<xsl:analyze-string select="regex-group(1)" regex="\s?(([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+)-(([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+)(\d+)">
<xsl:matching-substring>
<xsl:if test="matches(.,'\s?(([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+)-(([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+)(\d)')">
<cahier>
<lettre><xsl:value-of select="regex-group(1)"/></lettre><xsl:text>-</xsl:text>
<lettre><xsl:value-of select="regex-group(3)"/></lettre>
<nb><xsl:value-of select="regex-group(5)"/></nb>
</cahier>
</xsl:if>
</xsl:matching-substring>
<xsl:non-matching-substring>
<!--Si un seul cahier, sans tiret.
Ex : õ2
1°) (([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+) => õ => <lettre>
5°) (\d+) => 2 => <nb> -->
<xsl:analyze-string select="." regex="(([a-z]|[A-Z]|ã|ẽ|ĩ|õ|α|β)+)(\d+)">
<xsl:matching-substring>
<cahier>
<lettre><xsl:value-of select="regex-group(1)"/></lettre>
<nb><xsl:value-of select="regex-group(3)"/></nb>
</cahier>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:non-matching-substring>
</xsl:analyze-string>
</sig>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string></xml>
</xsl:template>
<!--Passage 2 : signatures pour chaque cahier-->
<xsl:template match="xml" mode="pass2">
<xml><xsl:apply-templates/></xml>
</xsl:template>
<!--Suppression de ce qui ne concerne pas les signatures-->
<xsl:template match="folio|corr|sig/text()" mode="pass2"/>
<!--Boucle afin d'incrémenter les lettres pour chaque ensemble de cahier-->
<xsl:template match="cahier" mode="pass2">
<xsl:call-template name="boucle">
<xsl:with-param name="debut"><xsl:value-of select="descendant::lettre[1]"/></xsl:with-param>
<xsl:with-param name="fin"><xsl:value-of select="descendant::lettre[last()]"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="boucle" match="cahier">
<xsl:param name="debut"><xsl:value-of select="descendant::lettre[1]"/></xsl:param>
<xsl:param name="fin"><xsl:value-of select="descendant::lettre[last()]"/></xsl:param>
<!--Une échelle pour les cahiers avec lettre minuscule et une autre pour ceux avec lettre majuscule. A paramétrer en fonction des caractères présents-->
<xsl:param name="lettres">abcdefghiklmnopqrstvxyz</xsl:param>
<xsl:param name="lettres2">ABCDEFGHIKLMNOPQRSTVXYZ</xsl:param>
<!--Dans le cas de signatures avec lettres multiples, variables permettant de transformer les dernières en minuscule-->
<xsl:variable name="majuscules">ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞΑΒ</xsl:variable>
<xsl:variable name="minuscules">abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþαβ</xsl:variable>
<!--Version complète pour archive-->
<!-- <xsl:param name="lettres">abcdefghiklmnopqrstvxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþαβ</xsl:param>
<xsl:param name="lettres2">ABCDEFGHIKLMNOPQRSTVXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞΑΒ</xsl:param>
<!-\-Dans le cas de signatures avec lettres multiples, variables permettant de transformer les dernières en minuscule-\->
<xsl:variable name="majuscules">ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞΑΒ</xsl:variable>
<xsl:variable name="minuscules">abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþαβ</xsl:variable>-->
<!--Partie déclarant la sortie : $ début renvoie au contenu après passage dans les différentes variables, suivi du dernier chiffre de chaque cahier-->
<cahier><lettre><xsl:value-of select="$debut"/></lettre><nb><xsl:value-of select="descendant::nb[last()]"/></nb><xsl:text>
</xsl:text></cahier>
<!-- Gestion des cas en fonction du nombre de lettre, les variables se basant sur les param et les positions de chaque lettre par rapport à la suivante.
En somme, un coupe afin de conserver uniquement la première lettre, puis on recompose l'ensemble du contenu.-->
<xsl:choose>
<xsl:when test="matches($debut,'^[^A-Z]$')">
<xsl:variable name="debut2" select="$debut"/>
<xsl:variable name="position" select="string-length(substring-before($lettres, $debut2)) + 1"/>
<xsl:variable name="suivant">
<xsl:value-of select="substring($lettres, $position +1, 1)"/>
</xsl:variable>
<xsl:if test="$suivant != '' and $debut2 != $fin">
<xsl:call-template name="boucle">
<xsl:with-param name="debut" select="$suivant"/>
<xsl:with-param name="fin" select="$fin"/>
<xsl:with-param name="lettres" select="$lettres"/>
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:when test="matches($debut,'^[A-Z]$')">
<xsl:variable name="debut2" select="$debut"/>
<xsl:variable name="position" select="string-length(substring-before($lettres2, $debut2)) + 1"/>
<xsl:variable name="suivant">
<xsl:value-of select="substring($lettres2, $position +1, 1)"/>
</xsl:variable>
<xsl:if test="$suivant != '' and $debut2 != $fin">
<xsl:call-template name="boucle">
<xsl:with-param name="debut" select="$suivant"/>
<xsl:with-param name="fin" select="$fin"/>
<xsl:with-param name="lettres" select="$lettres2"/>
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:when test="matches($debut,'^..$')">
<xsl:variable name="debut2" select="substring($debut,1,1)"/>
<xsl:variable name="fin2" select="substring($fin,1,1)"/>
<xsl:variable name="positionfin" select="string-length(substring-before($lettres2, $fin2)) + 1"></xsl:variable>
<xsl:variable name="position" select="string-length(substring-before($lettres2, $debut2)) + 1"/>
<xsl:variable name="suivant">
<xsl:choose><xsl:when test="matches(lettre[1],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[last()],'[abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþαβ]')"><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$suivant != '' and $debut2 != $fin2">
<xsl:call-template name="boucle">
<xsl:with-param name="debut" select="$suivant"/>
<xsl:with-param name="fin" select="$fin2"/>
<xsl:with-param name="lettres" select="$lettres2"/>
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:when test="matches($debut,'^...$')">
<xsl:variable name="debut2" select="substring($debut,1,1)"/>
<xsl:variable name="position" select="string-length(substring-before($lettres2, $debut2)) + 1"/>
<xsl:variable name="fin2" select="substring($fin,1,1)"/>
<xsl:variable name="suivant">
<xsl:choose><xsl:when test="matches(lettre[1],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[2],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[last()],'[a-z]')"><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$suivant != '' and $debut2 != $fin2">
<xsl:call-template name="boucle">
<xsl:with-param name="debut" select="$suivant"/>
<xsl:with-param name="fin" select="$fin2"/>
<xsl:with-param name="lettres" select="$lettres2"/>
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:when test="matches($debut,'^....$')">
<xsl:variable name="debut2" select="substring($debut,1,1)"/>
<xsl:variable name="position" select="string-length(substring-before($lettres2, $debut2)) + 1"/>
<xsl:variable name="fin2" select="substring($fin,1,1)"/>
<xsl:variable name="suivant">
<xsl:choose><xsl:when test="matches(lettre[1],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[2],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[3],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[last()],'[a-z]')"><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$suivant != '' and $debut2 != $fin2">
<xsl:call-template name="boucle">
<xsl:with-param name="debut" select="$suivant"/>
<xsl:with-param name="fin" select="$fin2"/>
<xsl:with-param name="lettres" select="$lettres2"/>
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:when test="matches($debut,'^.....$')">
<xsl:variable name="debut2" select="substring($debut,1,1)"/>
<xsl:variable name="position" select="string-length(substring-before($lettres2, $debut2)) + 1"/>
<xsl:variable name="fin2" select="substring($fin,1,1)"/>
<xsl:variable name="suivant">
<xsl:choose><xsl:when test="matches(lettre[1],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[2],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[3],'[a-z]')"><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[4],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[last()],'[A-Z]')"><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$suivant != '' and $debut2 != $fin2">
<xsl:call-template name="boucle">
<xsl:with-param name="debut" select="$suivant"/>
<xsl:with-param name="fin" select="$fin2"/>
<xsl:with-param name="lettres" select="$lettres2"/>
</xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:when test="matches($debut,'^......$')">
<xsl:variable name="debut2" select="substring($debut,1,1)"/>
<xsl:variable name="position" select="string-length(substring-before($lettres2, $debut2)) + 1"/>
<xsl:variable name="fin2" select="substring($fin,1,1)"/>
<xsl:variable name="suivant">
<xsl:choose><xsl:when test="matches(lettre[1],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[2],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[3],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[4],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[5],'[A-Z]')"><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:otherwise>
</xsl:choose>
<xsl:choose><xsl:when test="matches(lettre[last()],'[a-z]')"><xsl:value-of select="translate(substring($lettres2, $position +1, 1),$majuscules,$minuscules)"/></xsl:when>
<xsl:otherwise><xsl:value-of select="substring($lettres2, $position +1, 1)"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$suivant != '' and $debut2 != $fin2">
<xsl:call-template name="boucle">
<xsl:with-param name="debut" select="$suivant"/>
<xsl:with-param name="fin" select="$fin2"/>
<xsl:with-param name="lettres" select="$lettres2"/>
</xsl:call-template>
</xsl:if>
</xsl:when>
</xsl:choose>
</xsl:template>
<!--Passage 3 : Mutiplier les signatures de page de feuillet-->
<xsl:template match="folio|corr|sig/text()" mode="pass3"/>
<xsl:template name="bouclefor">
<xsl:param name="min"></xsl:param>
<xsl:param name="max"></xsl:param>
<xsl:text>
</xsl:text><xsl:value-of select="descendant::lettre"/><xsl:value-of select="$min"/><xsl:text>
</xsl:text>
<xsl:text></xsl:text><xsl:value-of select="descendant::lettre"/><xsl:value-of select="$min"/><xsl:text>v</xsl:text>
<xsl:if test="number($min)
< number($max - 1)">
<xsl:call-template name="bouclefor">
<xsl:with-param name="min">
<xsl:value-of select="$min + 1"></xsl:value-of>
</xsl:with-param>
<xsl:with-param name="max">
<xsl:value-of select="$max"></xsl:value-of>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="cahier" mode="pass3">
<xsl:call-template name="bouclefor">
<xsl:with-param name="min">1</xsl:with-param>
<xsl:with-param name="max">
<xsl:value-of select="descendant::nb +1"/>
</xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template match="sig" mode="pass4"><xsl:apply-templates/></xsl:template>
</xsl:stylesheet>