Permalink
Browse files

XSL for TEI to EOATeX conversion

  • Loading branch information...
kthoden committed May 29, 2018
1 parent 60bee92 commit 4274de2e40680afe2e1490dcd4bf9c3dd9cdb1a0
Showing with 341 additions and 0 deletions.
  1. +341 −0 data/tei2eoatex.xsl
View
@@ -0,0 +1,341 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:tei="http://www.tei-c.org/ns/1.0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="xs tei"
+ version="2.0">
+
+ <xsl:output method="text" encoding="UTF-8"/>
+ <xsl:strip-space elements="*"/>
+ <!--
+ make:
+ - formatting of several authors
+ - some fields could contain markup, this is currently ignored
+ -->
+
+ <xsl:template match="*">
+ <!--
+ catchall template
+ https://stackoverflow.com/questions/3360017/why-does-xslt-output-all-text-by-default
+ -->
+ <xsl:message terminate="no">WARNING: Unmatched element: <xsl:value-of select="name()"/></xsl:message>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="//tei:teiHeader/tei:fileDesc/tei:sourceDesc/tei:ab[@type='bibliography']/tei:ref">
+ <xsl:text>\EOAbibliographytype{</xsl:text>
+ <xsl:value-of select="@type"/>
+ <xsl:text>}&#x000a;</xsl:text>
+ <xsl:text>\EOAbibliographydatabase{</xsl:text>
+ <xsl:value-of select="@target"/>
+ <xsl:text>}&#x000a;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title[@level='s']">
+ <xsl:text>\input{preambel/pre_eoa}&#x000a;</xsl:text>
+ <xsl:text>\EOAseries{</xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>}&#x000a;</xsl:text>
+ </xsl:template>
+
+ <!-- ignore some header fields -->
+ <xsl:template match="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:author|tei:editor|tei:resp|tei:persName"/>
+ <xsl:template match="//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title[@type='main']"/>
+ <xsl:template match="//tei:teiHeader/tei:fileDesc/tei:editionStmt|tei:publicationStmt"/>
+ <xsl:template match="//tei:teiHeader/tei:fileDesc/tei:sourceDesc/tei:p"/>
+ <xsl:template match="//tei:teiHeader/tei:encodingDesc|tei:profileDesc|tei:revisionDesc"/>
+
+ <xsl:template match="tei:body//tei:p[not(ancestor::tei:note)]">
+ <xsl:choose>
+ <xsl:when test="@rend='Quote'">
+ <xsl:text>\begin{EOAquote}</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>\end{EOAquote}</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#x000a;&#x000a;</xsl:text>
+ <xsl:apply-templates />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="tei:body">
+ <xsl:text>&#x000a;\begin{document}&#x000a;\EOAtoc&#x000a;\newpage&#x000a;%beginning of chapter&#x000a;</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>% end of chapter&#x000a;\end{document}&#x000a;</xsl:text>
+ </xsl:template>
+ <!--
+ <xsl:template match="interview">
+ <xsl:text>\section{Interview mit </xsl:text>
+ <xsl:value-of select="@pseudonym"/>
+ <xsl:text>}&#x000a;</xsl:text>
+ <xsl:text>\begin{tabular}{l l}&#x000a;\textbf{Pseudonym:} &amp;</xsl:text>
+ <xsl:value-of select="@pseudonym"/>
+ <xsl:text>\\&#x000a;\textbf{ID:} &amp;</xsl:text>
+ <xsl:value-of select="@code"/>
+ <xsl:text>\\&#x000a;\textbf{Datum:} &amp;</xsl:text>
+ <xsl:value-of select="@datum"/>
+ <xsl:text>\\&#x000a;\textbf{Zeit:} &amp;</xsl:text>
+ <xsl:value-of select="@anfang"/><xsl:text>&#x0020;&#x2013;&#x0020;</xsl:text><xsl:value-of select="@ende"/>
+ <xsl:text>\\&#x000a;\textbf{Dauer:} &amp;</xsl:text>
+ <xsl:value-of select="@dauer"/>
+ <xsl:choose>
+ <xsl:when test="@bemerkungen=''">
+ <xsl:message>No Bemerkung</xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>\\&#x000a;\textbf{Bemerkungen:} &amp;</xsl:text>
+ <xsl:value-of select="@bemerkungen"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#x000a;\end{tabular}&#x000a;\begin{center}&#x000a;\line(1,0){250}&#x000a;\end{center}&#x000a;</xsl:text>
+ <xsl:text>\resetlinenumber&#x000a;\begin{linenumbers}</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>&#x000a;\end{linenumbers}</xsl:text>
+ </xsl:template>
+ -->
+
+ <xsl:template match="//tei:hi[@rend='italic']">
+ <xsl:text>\EOAemph{</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>}</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="//tei:div[@type='chapter']/tei:head">
+ <xsl:text>\EOAchapter</xsl:text>
+ <xsl:choose>
+ <xsl:when test="../@rend='nonumber'">
+ <xsl:text>nonumber</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>INFO: Section has number</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>{</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>}</xsl:text>
+ <xsl:text>{</xsl:text>
+ <xsl:apply-templates />
+ <xsl:choose>
+ <xsl:when test="not(../@resp)">
+ <xsl:message>INFO: No chapter author.</xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- needs formatting of several authors -->
+ <xsl:variable name="authorid" select="substring-after(../@resp, '#')"/>
+ <xsl:text>\EOAauthor{</xsl:text>
+ <xsl:value-of select="concat(//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:respStmt[@xml:id=$authorid]/tei:persName/tei:forename, ' ', //tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:respStmt[@xml:id=$authorid]/tei:persName/tei:surname)"/>
+ <xsl:text>}</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>}</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="not(../@xml:id)">
+ <xsl:message>INFO: Chapter has not ID</xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>\EOAlabel{</xsl:text>
+ <xsl:value-of select="../@xml:id"/>
+ <xsl:text>}&#x000a;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="//tei:div[not(@type='chapter')]/tei:head">
+ <xsl:choose>
+ <xsl:when test="../@type='part'">
+ <xsl:text>\EOApart</xsl:text>
+ </xsl:when>
+ <xsl:when test="../@type='section'">
+ <xsl:text>&#x000a;&#x000a;\EOAsection</xsl:text>
+ </xsl:when>
+ <xsl:when test="../@type='subsection'">
+ <xsl:text>&#x000a;&#x000a;\EOAsubsection</xsl:text>
+ </xsl:when>
+ <xsl:when test="../@type='subsubsection'">
+ <xsl:text>&#x000a;&#x000a;\EOAsubsubsection</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="../@rend='nonumber'">
+ <xsl:text>nonumber</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>INFO: Section has number</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>{</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>}</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not(../@xml:id)">
+ <xsl:message>INFO: No ID for section</xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>\EOAlabel{</xsl:text>
+ <xsl:value-of select="../@xml:id"/>
+ <xsl:text>}</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#x000a;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="//tei:bibl">
+ <xsl:choose>
+ <xsl:when test="./tei:ref[@type='inline']">
+ <xsl:text>\EOAciteyear</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>\EOAciteauthoryear</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./tei:citedRange[not(@*)]">
+ <xsl:text>[</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="./tei:citedRange/@from">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="./tei:citedRange/@from"/>
+ <xsl:choose>
+ <xsl:when test="./tei:citedRange/@to">
+ <xsl:text>–</xsl:text>
+ <xsl:value-of select="./tei:citedRange/@to"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>INFO: citation has no to value</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>{</xsl:text>
+ <xsl:value-of select="substring-after(./tei:ref/@target, '#')"/>
+ <xsl:text>}</xsl:text>
+ </xsl:template>
+
+ <!--
+ <xsl:template match="//tei:note[@place='bottom']/tei:p[position() = last()]">
+ <xsl:message>last </xsl:message>
+ </xsl:template>
+ -->
+
+ <xsl:template match="//tei:note[@place='bottom']">
+ <xsl:text>\EOAfn{</xsl:text>
+ <xsl:choose>
+ <xsl:when test="count(./tei:p)=1">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="count(./tei:p)>1">
+ <xsl:message>INFO: Number of paragraphs in larger than 1 </xsl:message>
+ <xsl:for-each select="./tei:p">
+ <xsl:choose>
+ <xsl:when test="position() != last()">
+ <xsl:apply-templates />
+ <xsl:text>\EOAfnpar</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:text>}</xsl:text>
+ </xsl:template>
+
+ <!-- <figure><graphic url="images/Fig.1CarteDuCielPotsdam.jpg"/><head>Glass photographic plate from the Carte du Ciel survey, Potsdam Observatory, Plate 5, taken January 11, 1894. The plate is approximately 16 cm x 16 cm; each plate covered two square degrees of the sky. Courtesy of the Leibniz-Institut für Astrophysik, Potsdam</head></figure>
+
+\EOAfigure{images/1.jpg}{Ostafrikanische Arbeiter an einem der großen Knochengräben, die während der paläontologischen Expedition des \EOAemph{Berliner Naturkundemuseums} in die damalige Kolonie Deutsch-Ostafrika zwischen 1909 und 1913 angelegt wurden. (Koloriertes Glasdiapositiv, Museum für Naturkunde Berlin, Historische Bild- u. Schriftgutsammlungen, Bestand: Pal. Mus., Signatur: B V/177)}{sec2:image1a}{66}{H}
+ -->
+
+ <xsl:template match="//tei:body//tei:ref[starts-with(@type, 'number')]">
+ <xsl:text>\EOAref{</xsl:text>
+ <xsl:value-of select="substring-after(@target, '#')"/>
+ <xsl:text>}</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="//tei:body//tei:ref[@type='url']">
+ <xsl:text>\EOAurl{</xsl:text>
+ <xsl:value-of select="@target"/>
+ <xsl:text>}</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="//tei:figure[@type='hionly']">
+ <xsl:text>&#x000a;\refstepcounter{figure}%&#x000a;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="//tei:figure[not(@type='hionly')]">
+ <xsl:text>&#x000a;&#x000a;\EOAfigure{</xsl:text>
+ <xsl:value-of select="./tei:graphic/@url"/>
+ <xsl:text>}{</xsl:text>
+ <xsl:apply-templates select="./tei:head"/>
+ <xsl:text>}</xsl:text>
+ <xsl:text>{</xsl:text>
+ <xsl:value-of select="@xml:id"/>
+ <xsl:text>}</xsl:text>
+ <!-- need size! -->
+ <xsl:text>{66}</xsl:text>
+ <!-- place needs to be adjusted -->
+ <xsl:text>{ht}</xsl:text>
+ </xsl:template>
+
+ <xsl:template name="string-replace-all">
+ <xsl:param name="text" />
+ <xsl:param name="replace" />
+ <xsl:param name="by" />
+ <xsl:choose>
+ <xsl:when test="contains($text, $replace)">
+ <xsl:value-of select="substring-before($text,$replace)" />
+ <xsl:value-of select="$by" />
+ <xsl:call-template name="string-replace-all">
+ <xsl:with-param name="text"
+ select="substring-after($text,$replace)" />
+ <xsl:with-param name="replace" select="$replace" />
+ <xsl:with-param name="by" select="$by" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$text" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="text()">
+ <xsl:call-template name="string-replace-all">
+ <xsl:with-param name="text" select="." />
+ <xsl:with-param name="replace" select="'&amp;'" />
+ <xsl:with-param name="by" select="'\&amp;'" />
+ </xsl:call-template>
+ <!--
+ <xsl:call-template name="string-replace-all">
+ <xsl:with-param name="text" select="." />
+ <xsl:with-param name="replace" select="'&amp;'" />
+ <xsl:with-param name="by" select="'\&amp;'" />
+ </xsl:call-template>
+ -->
+ <xsl:apply-templates />
+ </xsl:template>
+
+ <!--
+ <xsl:template match="text()">
+ <xsl:call-template name="string-replace-all">
+ <xsl:with-param name="text" select="." />
+ <xsl:with-param name="replace" select="'#'" />
+ <xsl:with-param name="by" select="'\#'" />
+ </xsl:call-template>
+ <xsl:apply-templates />
+ </xsl:template>
+ -->
+
+ <xsl:template match="processing-instruction('eoa')">
+ <xsl:text>\EOAprintbibliography&#x000a;&#x000a;</xsl:text>
+ </xsl:template>
+</xsl:stylesheet>

0 comments on commit 4274de2

Please sign in to comment.