NotesToRefs.xsl

From TEIWiki
Jump to navigation Jump to search

Summary

This is a stylesheet from the Croatiae auctores Latini TEI XML collection. For publishing under PhiloLogic, the TEI XML should conform to PhiloLogic specifications; this stylesheet reformats notes in the text, adding (empty) ref elements, creating attributes both for ref and note as required, and moving all note elements to a separate div in the back.

Required input

TEI XML file with note and pb elements (pb is used by PhiloLogic for backlinks).

Expected output

TEI XML file conforming to PhiloLogic specification.


Known restrictions

Resp element is hardwired to auctor; ref type set to "nota", specific for CroALa.

 
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:tei="http://www.tei-c.org/ns/1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <!-- title: ref for notes, moves notes to back div -->
    <!-- author: Neven Jovanović, Croatiae auctores Latini -->
    <!-- description: adds ref elements in front of notes elements -->
    <!-- description: adds xml:id, target and resp attributes to notes -->
    <!-- description: adds type, xml:id, target and n attributes to refs -->
    <!-- description: moves notes to a separate div in the back -->
    <!-- description: makes possible linking from refs to notes and vice versa -->
    <!-- filename: movingnotes.xsl -->
    <!-- modified: 2011-02-12 -->
    <!-- required input: tei xml file, using a CroALa subset (or similar), with notes and pbs (for linking back) -->
    <!-- expected output: tei xml file according to PhiloLogic specification -->
    <!-- known restrictions: resp hardwired to auctor; ref type set to "nota" for CroALa -->
    <!-- movingnotes.xsl -->
 

    <!-- copy all... -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <!-- ... but the note elements, for which call the scribrefs template to edit -->
    <xsl:template match="//tei:note">
        <xsl:call-template name="scribrefs"/>
    </xsl:template>
    <!-- test if the last child is named "back" -->
        <xsl:template match="//tei:text/*[last()]">
            <xsl:choose>
                <xsl:when test="tei:back">
                    <xsl:call-template name="backref"/>
                    
                </xsl:when>
                <xsl:otherwise>
                    
                    <xsl:copy>
                        <xsl:apply-templates select="@*|node()"/>
                        <!-- create a back element -->
                        <xsl:element namespace="http://www.tei-c.org/ns/1.0" name="back">
                            <!-- create a div with a type atrribute = notes -->
                            <xsl:element name="div" namespace="http://www.tei-c.org/ns/1.0">
                                <xsl:attribute name="type">notes</xsl:attribute>
                                <!-- give it a Latin heading  -->
                                <xsl:element name="head" namespace="http://www.tei-c.org/ns/1.0">
                                    <xsl:text>Notae</xsl:text>
                                </xsl:element>
                                <!-- Philologic says a pb element should be here -->
                                <xsl:element name="pb" namespace="http://www.tei-c.org/ns/1.0">
                                    <xsl:attribute name="n">nts</xsl:attribute>
                                </xsl:element>
                                <!-- put inside it all notes from the document -->
                                <xsl:for-each select="//tei:note">
                                    <xsl:call-template name="scribnot"/>
                                </xsl:for-each>
                            </xsl:element>
                        </xsl:element>
                    </xsl:copy>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:template>
    
    
<xsl:template name="scribrefs">
    <!--  which we replace with empty refs, citing carefully the TEI namespace -->
    <xsl:element name="ref" namespace="http://www.tei-c.org/ns/1.0">
        <!-- structure: typed as notae (Latin), have ids (beginning with ref),  -->
        <!--  have targets (beginning with n); -->
        <!--  notes will have ids and targets the other way around -->
        <!-- the attributes should really have xml:id; -->
        <!-- have to check if this agrees with the philosubs.pl of PhiloLogic.  -->
        <xsl:attribute name="type">nota</xsl:attribute>
        <xsl:attribute name="xml:id">
            <!-- ids begin with ref -->
            <xsl:text>r</xsl:text>
            <!-- Here we generate an identifier -->
            <!-- "if you call generate-id() more than once in one run with the same 
                node as an argument, the processor generates the same ID value each 
                time for that node." DuCharme, XML Quickly, p. 244-245. -->
            <!-- Without this feature it would be tough connecting refs with their respective notes.  -->
            <xsl:value-of select="generate-id(.)"/>
        </xsl:attribute>
        <xsl:attribute name="target">
            <xsl:text>n</xsl:text>
            <xsl:value-of select="generate-id(.)"/>
        </xsl:attribute>
        <xsl:attribute name="n">
            <xsl:number/>
        </xsl:attribute>
    </xsl:element>
</xsl:template>
<xsl:template name="backref" match="//tei:back">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        
        
        <!-- we introduce a new div, typed as notes -->
        <xsl:element name="div" namespace="http://www.tei-c.org/ns/1.0">
            <xsl:attribute name="type">notes</xsl:attribute>
            <!-- with a Latin heading  -->
            <xsl:element name="head" namespace="http://www.tei-c.org/ns/1.0">
                <xsl:text>Notae</xsl:text>
            </xsl:element>
            <!-- inside it go all notes from the document -->
            <xsl:for-each select="//tei:note">
                <xsl:call-template name="scribnot"/>
            </xsl:for-each>
        </xsl:element>
    </xsl:copy>
</xsl:template>
    <xsl:template name="scribnot">
        <xsl:copy>
            <!-- their id begins with n, their targets with ref -->
            <!--  (vice versa compared to refs inside text) -->
            <xsl:attribute name="place">foot</xsl:attribute>
            <!-- otherwise, almost the same as with ref elements (except notes are not empty) -->
            <xsl:attribute name="xml:id">
                <xsl:text>n</xsl:text>
                <xsl:value-of select="generate-id(.)"/>
            </xsl:attribute>
            <xsl:attribute name="target">
                <xsl:text>r</xsl:text>
                <xsl:value-of select="generate-id(.)"/>
            </xsl:attribute>
            <!-- after we select and copy everything enclosed in note, -->
            <xsl:apply-templates select="@*|node()"/>
            <!-- add a carriage return, for tidiness -->
        </xsl:copy><xsl:text>
        </xsl:text>
    </xsl:template>
    
</xsl:stylesheet>