Generate tagsDecl P5.xslt
Jump to navigation
Jump to search
This program reads in a TEI P5 document and writes out one or more <tagsDecl> elements that reflect the encoding of that document. If the root element of the input document is <TEI>, then there is one output <tagsDecl>. If the root element is <teiCorpus>, then there should be one output <tagsDecl> for each input <TEI>, but I have never actually tested this. Note that if 2 or more output <tagsDecl>s are generated, then the output is not actually well-formed XML 1.0, as there will be 2 or more root elements.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- generate_tagsDecl.xslt -->
<!-- Read in a TEI P5 document and write out a <tagsDecl> element that -->
<!-- reflects its encoding. -->
<!-- Copyleft 2009 by Syd Bauman and the Brown University Women Writers Project -->
<!-- Based very heavily on James Cummings' Count-Elements.xsl at -->
<!-- http://wiki.tei-c.org/index.php/Count-Elements.xsl 2009-07-06 -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.tei-c.org/ns/1.0"
xmlns:tei="http://www.tei-c.org/ns/1.0">
<xsl:output method="xml" indent="yes"/>
<!-- Generate a key for element names (local). -->
<!-- A Perlese example of the use of this key would be-->
<!-- $gis{emph}, which reference would return a nodeset -->
<!-- of all the <*:emph> nodes, I think -->
<xsl:key name="gis" use="local-name()"
match="/tei:TEI/tei:text//*|/tei:teiCorpus/tei:TEI/tei:text//*"/>
<!-- Generate a key for element namespaces. -->
<!-- A Perlese example of the use of this key would be-->
<!-- $nss{svg}, which reference would return a nodeset -->
<!-- of all the namespace URIs of <*:svg> nodes, I think -->
<xsl:key name="nss" use="namespace-uri()"
match="/tei:TEI/tei:text//*|/tei:teiCorpus/tei:TEI/tei:text//*"/>
<xsl:template match="/">
<!-- Since the <tagsDecl> talks about the elements "occurring within the -->
<!-- outermost <text> element of a TEI document", we only want to match the -->
<!-- outermost <text> element(s) -->
<xsl:apply-templates select="/tei:TEI/tei:text | /tei:teiCorpus/tei:TEI/tei:text"/>
</xsl:template>
<xsl:template match="tei:text">
<!-- generate an output tagging declaration for each input <text> -->
<tagsDecl>
<!-- process each node that is the first one in a set of nodes with the same namespace -->
<xsl:for-each select="//*[generate-id(.)=generate-id(key('nss',namespace-uri(.))[1])]">
<!-- keep sorted by said namesapce -->
<xsl:sort select="namespace-uri()"/>
<!-- and remember said namespace for easy reference -->
<xsl:variable name="ns" select="namespace-uri()"/>
<!-- output a <namespace> element in which to list the elemenst used in this namespace -->
<namespace name="{$ns}">
<!-- process each node that has this namespace and is the first one in the set of nodes with the same -->
<!-- local name -->
<xsl:for-each select="//*[namespace-uri(.)=$ns][generate-id(.)=generate-id(key('gis',local-name(.))[1])]">
<!-- sort by the local name -->
<xsl:sort select="local-name()"/>
<!-- putput a <tagUsage> element that gives counts for the number -->
<!-- of similarly named descendants of <text> and number of those -->
<!-- that are identified with xml:id=. -->
<tagUsage gi="{local-name(.)}"
occurs="{count( key('gis', local-name(.) ) )}"
withId="{count( key('gis', local-name(.) )[@xml:id] )}"/>
</xsl:for-each>
</namespace>
</xsl:for-each>
</tagsDecl>
</xsl:template>
</xsl:stylesheet>