Count Metrical Lines P4.xslt
Jump to navigation
Jump to search
Counting <l> elements in a TEI document is pretty easy. But when a metrical line is broken in order to handle overlap, e.g., often two or more TEI <l> elements are used to represent a single metrical line. There are several mechanisms for indicating this fact, two of the more common of which are the use of the part= attribute and the use of the next= & prev= attributes. This stylesheet counts metrical lines in a TEI P4 document, taking into consideration those that have been encoded using several <l> elements using these mechanisms. It does not take other mechanisms (e.g., <join>) into account.
<?xml version="1.0" encoding="UTF-8"?> <!-- Count lines of poetry, P4 version --> <!-- Conceived and written 2006-02-19 by Syd Bauman --> <!-- Copyleft 2006 Syd Bauman --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="/TEI.2"> <xsl:apply-templates/> </xsl:template> <!-- Only look at <l> elements inside the outermost <text> element --> <!-- (Not likely that there are <l> elements in the <teiHeader>, but --> <!-- you never know.) --> <xsl:template match="/TEI.2/text"> <xsl:text>There are </xsl:text> <!-- count all lines that do not claim to be continuations of another line elsewhere --> <xsl:value-of select="count(.//l[not(@prev) and not(@part='M') and not(@part='F')])"/> <xsl:text> metrical lines in “</xsl:text> <xsl:apply-templates select="/TEI.2/teiHeader/fileDesc/titleStmt/title[@type='main' or not(@type)][1]"/> <xsl:text>”</xsl:text> <!-- <l> with part="Y" are metrically incomplete lines, which need to be reported separately --> <xsl:variable name="incomplete" select="count(.//l[@part='Y'])"/> <xsl:if test="$incomplete > 0"> <xsl:text>, of which </xsl:text> <xsl:value-of select="$incomplete"/> <!-- singular or plural? --> <xsl:choose> <xsl:when test="$incomplete = 1"> <xsl:text> is</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text> are</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text> incomplete</xsl:text> </xsl:if> <xsl:text>.</xsl:text> </xsl:template> <!-- for a <title>, just return the string-value of its children --> <!-- (We don't have to worry about this template applying except --> <!-- when we ask for it, above, because any other ancestor will --> <!-- be completely ignored anyway (see below).) --> <xsl:template match="title"> <xsl:apply-templates/> </xsl:template> <!-- Just ignore most anything and everything else --> <xsl:template match="*"/> </xsl:stylesheet>