Tei scancan p4 to p5
Jump to navigation
Jump to search
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.tei-c.org/ns/1.0">
<!-- Copyleft December 2006 by Martin Holmes.
This is a small, specialized stylesheet which is customized for one specific project
(the Scandinavian-Canadians Studies Journal). It imports the generic Copy-All.xsl file,
but all other transformations are contained here. It's not expected to be generally
useful, but if you have a simple project that needs a quick
conversion, this might serve as a starting point or a helpful example.
Along with Copy-All.xsl, it does the whole job, including putting the result document
into the TEI namespace (by means of the xmlns attribute on the xsl:stylesheet root
element).
-->
<xsl:import href="Copy-All.xsl" />
<xsl:output encoding="UTF-8" method="xml" />
<!-- This attribute is for supplying a value for an attribute required in P5
which is not present in the P4 XML. -->
<xsl:variable name="DefAttVal">scancan</xsl:variable>
<!-- Suppress matching of TEIform, status and other default attributes;
I don't use these. -->
<xsl:template match="@TEIform"></xsl:template>
<xsl:template match="@status"></xsl:template>
<xsl:template match="@default"></xsl:template>
<xsl:template match="@org[.='uniform']"></xsl:template>
<xsl:template match="@sample[.='complete']"></xsl:template>
<xsl:template match="@part[.='N']"></xsl:template>
<xsl:template match="@direct[.='unspecified']"></xsl:template>
<xsl:template match="@targOrder[.='U']"></xsl:template>
<xsl:template match="@from[.='ROOT']"></xsl:template>
<xsl:template match="@anchored[.='yes']"></xsl:template>
<xsl:template match="@place[.='unspecified']"></xsl:template>
<xsl:template match="teiHeader/@type"></xsl:template>
<!-- Convert id to xml:id. -->
<xsl:template match="@id">
<xsl:attribute name="xml:id"><xsl:value-of select="." /></xsl:attribute>
</xsl:template>
<xsl:template match="TEI.2">
<xsl:element name="TEI" namespace="http://www.tei-c.org/ns/1.0">
<!--<xsl:attribute name="xmlns">http://www.tei-c.org/ns/1.0</xsl:attribute>-->
<!-- Add new attributes we need. -->
<xsl:attribute name="xmlns:xsi">http://www.w3.org/2001/XMLSchema-instance</xsl:attribute>
<xsl:attribute name="xsi:schemaLocation">http://www.tei-c.org/ns/1.0 tei_scancan_p5.xsd</xsl:attribute>
<xsl:attribute name="version">5.0</xsl:attribute>
<xsl:apply-templates select="* | @*" />
</xsl:element>
</xsl:template>
<xsl:template match="teiCorpus.2">
<xsl:element name="teiCorpus">
<xsl:attribute name="xmlns:xsi">http://www.w3.org/2001/XMLSchema-instance</xsl:attribute>
<xsl:attribute name="xsi:schemaLocation">http://www.tei-c.org/ns/1.0 tei_scancan_p5.xsd</xsl:attribute>
<!--<xsl:attribute name="xmlns">http://www.tei-c.org/ns/1.0</xsl:attribute>-->
<xsl:attribute name="version">5.0</xsl:attribute>
<xsl:apply-templates select="* | @*" />
</xsl:element>
</xsl:template>
<!-- Handling names and their regularization. -->
<!-- First, suppress the reg attribute. -->
<xsl:template match="@reg"></xsl:template>
<xsl:template match="name">
<xsl:element name="name">
<xsl:apply-templates select="* | @* | text()" />
<!-- Now turn the reg attribute into an element. -->
<xsl:if test="@reg"><xsl:element name="reg"><xsl:value-of select="@reg" /></xsl:element></xsl:if>
</xsl:element>
</xsl:template>
<!-- Suppress respStmt/lb -->
<xsl:template match="respStmt/lb"></xsl:template>
<!-- Supply a default scheme attribute for classCode and keywords elements. -->
<xsl:template match="classCode | keywords">
<xsl:element name="{local-name(.)}">
<xsl:if test="not(@scheme)"><xsl:attribute name="scheme"><xsl:value-of select="$DefAttVal" /></xsl:attribute></xsl:if>
<xsl:apply-templates select="* | @* | text()" />
</xsl:element>
</xsl:template>
<!-- qs inside cits need to be converted to quote elements. -->
<xsl:template match="cit/q">
<xsl:element name="quote">
<xsl:apply-templates select="* | @* | text()" />
</xsl:element>
</xsl:template>
<!-- Special case, probably due to erroneous use of respStmt: we sometimes have
name elements embedded in resp elements. These need to be unravelled. -->
<xsl:template match="respStmt/resp[child::name]">
<xsl:element name="resp">
<xsl:value-of select="child::text()" />
</xsl:element>
<xsl:apply-templates select="child::name" />
</xsl:template>
<!-- This is provisional, pending some feedback from TEI-L on how to encode email
addresses in P5. -->
<!-- Convert xptr elements for email addresses to ptr. -->
<!-- First suppress the attributes we're going to harvest. -->
<xsl:template match="xptr/@type | xptr/@to"></xsl:template>
<xsl:template match="xptr">
<xsl:element name="ptr">
<xsl:if test="(@type='email') and (@to)">
<xsl:attribute name="target">mailto:<xsl:value-of select="@to" /></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="node() | text()" />
</xsl:element>
</xsl:template>
<!-- In P5, the value attribute of the date element has been tightened up.
This handles date ranges which are expressed in date/@value attributes,
as well as other unacceptable values such as "1963a". -->
<xsl:template match="date">
<xsl:element name="date">
<!-- We're going to assume (bravely) that date ranges are YYYY-YYYY. -->
<xsl:choose>
<xsl:when test="string-length(@value) = 9">
<xsl:attribute name="from"><xsl:value-of select="substring-before(@value, '-')" /></xsl:attribute>
<xsl:attribute name="to"><xsl:value-of select="substring-after(@value, '-')" /></xsl:attribute>
</xsl:when>
<!-- We're going to assume (again bravely) that date values used in biblios to
tag items as "1963a, 1963b" etc. always have 5 characters. Shave off anything
after the year, and put it into an n attribute. -->
<xsl:when test="string-length(@value) = 5">
<xsl:attribute name="value"><xsl:value-of select="substring(@value, 1, 4)" /></xsl:attribute>
<xsl:attribute name="n"><xsl:value-of select="substring(@value, 5)" /></xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="@value" />
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="* | text() | @*[name() != 'value']" />
</xsl:element>
</xsl:template>
<!-- Abbreviations and expansions. -->
<xsl:template match="abbr[@expan]">
<xsl:element name="choice">
<xsl:element name="abbr"><xsl:value-of select="./child::text()" /></xsl:element>
<xsl:element name="expan"><xsl:value-of select="@expan" /></xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>