Difference between revisions of "NotesToRefs.xsl"
Jump to navigation
Jump to search
Filologanoga (talk | contribs) (New page: This is a stylesheet from the Croatiae auctores Latini TEI XML collection. For publishing under PhiloLogic, the TEI XML should conform to [http://sites.google.com/site/philologic3/encoding...) |
(No difference)
|
Revision as of 00:16, 13 February 2011
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.
<?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 should be changed 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>