Generate tagsDecl P5.xslt

This program reads in a TEI P5 document and writes out one or more &lt;tagsDecl> elements that reflect the encoding of that document. If the root element of the input document is &lt;TEI>, then there is one output &lt;tagsDecl>. If the root element is &lt;teiCorpus>, then there should be one output &lt;tagsDecl> for each input &lt;TEI>, but I have never actually tested this. Note that if 2 or more output &lt;tagsDecl>s are generated, then the output is not actually well-formed XML 1.0, as there will be 2 or more root elements.





<xsl:output method="xml" indent="yes"/>

<xsl:key name="gis" use="local-name" match="/tei:TEI/tei:text//*|/tei:teiCorpus/tei:TEI/tei:text//*"/> <xsl:key name="nss" use="namespace-uri" match="/tei:TEI/tei:text//*|/tei:teiCorpus/tei:TEI/tei:text//*"/>

<xsl:template match="/"> <xsl:apply-templates select="/tei:TEI/tei:text | /tei:teiCorpus/tei:TEI/tei:text"/> </xsl:template> <xsl:template match="tei:text"> <tagsDecl> <xsl:for-each select="//*[generate-id(.)=generate-id(key('nss',namespace-uri(.))[1])]"> <xsl:sort select="namespace-uri"/> <xsl:variable name="ns" select="namespace-uri"/> <namespace name="{$ns}"> <xsl:for-each select="//*[namespace-uri(.)=$ns][generate-id(.)=generate-id(key('gis',local-name(.))[1])]"> <xsl:sort select="local-name"/> <tagUsage gi="{local-name(.)}" occurs="{count( key('gis', local-name(.) ) )}" withId="{count( key('gis', local-name(.) )[@xml:id] )}"/> </xsl:for-each> </xsl:for-each> </tagsDecl> </xsl:template>

</xsl:stylesheet>