Skip to content
Permalink
93de43745e
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
405 lines (350 sloc) 13.2 KB
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
xmlns:tei="http://www.tei-c.org/ns/1.0"
extension-element-prefixes="exsl"
>
<xsl:output
method="text"
encoding="utf-8"
indent="yes"
/>
<!-- utilities: -->
<xsl:variable name='newline'><xsl:text>&#xa;</xsl:text></xsl:variable>
<!-- entry point: -->
<xsl:template match="/tei:TEI">
<xsl:text># ODD statistics</xsl:text>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<xsl:text>## all tags used in the ODD:</xsl:text>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<xsl:for-each-group select="//*" group-by="name(.)">
<xsl:sort select="count(current-group())" order="descending"/>
<xsl:text>- </xsl:text>
<xsl:value-of select="current-grouping-key()"/>
<xsl:text> (</xsl:text>
<xsl:value-of select="count(current-group())"/>
<xsl:text> )</xsl:text>
<xsl:value-of select="$newline"/>
</xsl:for-each-group>
<xsl:value-of select="$newline"/>
<xsl:text>## all modules and elements </xsl:text>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<!-- only list modules, from which any elements or classes have actually been used: -->
<xsl:for-each-group select="//tei:*[@module]" group-by="@module">
<xsl:text>- </xsl:text>
<xsl:value-of select="current-grouping-key()"/>
<xsl:if test="current-group()[ name() = 'elementSpec' ]/@ident">
<xsl:text> (</xsl:text>
<xsl:value-of select="current-group()[ name() = 'elementSpec' ]/@ident" separator=", "/>
<xsl:text>)</xsl:text>
</xsl:if>
<xsl:value-of select="$newline"/>
</xsl:for-each-group>
<xsl:value-of select="$newline"/>
<xsl:text>## structured view </xsl:text>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<xsl:text>modules:</xsl:text>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<xsl:for-each-group select="//tei:*[@module]" group-by="@module">
<xsl:variable name="module" select="current-grouping-key()"/>
<xsl:text>- </xsl:text><xsl:value-of select="$module"/>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<xsl:text> elements:</xsl:text>
<xsl:choose>
<xsl:when test="//tei:elementSpec[@module=$module]">
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<xsl:for-each select="//tei:elementSpec[@module=$module]">
<xsl:call-template name="print-element-entry">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="indentation" select="' '"/>
</xsl:call-template>
<xsl:value-of select="$newline"/>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:text> (none) </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<xsl:text> model classes:</xsl:text>
<xsl:call-template name="print-class-hierarchy">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="classtype" select="'model'"/>
<xsl:with-param name="indentation" select="' '"/>
</xsl:call-template>
<xsl:text> attribute classes:</xsl:text>
<xsl:call-template name="print-class-hierarchy">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="classtype" select="'atts'"/>
<xsl:with-param name="indentation" select="' '"/>
</xsl:call-template>
</xsl:for-each-group>
</xsl:template>
<!-- print an elementSpec as list entry with additional infos: -->
<xsl:template name="print-element-entry">
<xsl:param name="module"/>
<xsl:param name="indentation"/>
<xsl:variable name="this" select="."/>
<xsl:value-of select="$indentation"/>
<xsl:text>- </xsl:text>
<xsl:call-template name="print-element"/>
<xsl:value-of select="$newline"/>
<xsl:value-of select="concat($indentation,' ')"/>
<!-- print attributes: -->
<xsl:text>- attributes: </xsl:text>
<xsl:for-each select="tei:attList/tei:attDef">
<xsl:choose>
<xsl:when test="@mode = 'delete'">
<xsl:text>DELETE:</xsl:text>
</xsl:when>
</xsl:choose>
<xsl:text>@</xsl:text>
<xsl:value-of select="@ident"/>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:if test="tei:attList/tei:attDef and //tei:classSpec[@type = 'atts'][@ident = $this/tei:classes/tei:memberOf/@key]">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:for-each select="//tei:classSpec[@type = 'atts'][@ident = $this/tei:classes/tei:memberOf/@key]">
<xsl:call-template name="print-class">
<xsl:with-param name="explicit_module" select="@module != $module"/>
<xsl:with-param name="module" select="@module != $module"/>
<xsl:with-param name="list_members" select="2"/>
</xsl:call-template>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<!-- print content: -->
<xsl:value-of select="$newline"/>
<xsl:value-of select="concat($indentation,' ')"/>
<xsl:text>- subelements: </xsl:text>
<xsl:for-each select="//tei:elementSpec[@ident = $this/tei:content//tei:elementRef/@key]">
<xsl:call-template name="print-element">
<xsl:with-param name="explicit_module" select="@module != $module"/>
</xsl:call-template>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<!-- model classes: -->
<xsl:value-of select="$newline"/>
<xsl:value-of select="concat($indentation,' ')"/>
<xsl:text>- member of: </xsl:text>
<xsl:for-each select="//tei:classSpec[@type='model'][@ident = $this//tei:memberOf/@key]">
<xsl:call-template name="print-class">
<xsl:with-param name="explicit_module" select="@module != $module"/>
<xsl:with-param name="module" select="$module"/>
</xsl:call-template>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
<!-- print a nested list of classSpecs of some type which are in the given module -->
<xsl:template name="print-class-hierarchy">
<xsl:param name="module"/>
<xsl:param name="classtype"/>
<xsl:param name="indentation"/>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
<xsl:for-each select="//tei:classSpec[@type=$classtype][@module=$module]">
<xsl:variable name="this" select="."/>
<xsl:variable name="children" select="//tei:classSpec[tei:classes/tei:memberOf/@key = $this/@ident]"/>
<!--
the hierarchy looks like this (example):
- att.datable
- att.datable.w3c
...
this corresponds to:
<classSpec module="tei" type="atts" ident="att.datable">
<classes>
<memberOf key="att.datable.w3c"/>
<memberOf key="att.datable.iso"/>
<memberOf key="att.datable.custom"/>
</classes>
...
</classSpec>
<classSpec module="tei" type="atts" ident="att.datable.w3c" >
...
</classSpec>
-->
<!-- if this class is not a parent of another class in this module
(otherwise it is listed as a parent, or in the other module)
-->
<xsl:if test="count($children[@module=$module]) = 0">
<xsl:call-template name="print-class-entry">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="classtype" select="$classtype"/>
<xsl:with-param name="indentation" select="' '"/>
</xsl:call-template>
<xsl:value-of select="$newline"/>
</xsl:if>
</xsl:for-each>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
</xsl:template>
<!-- print an entry in a list of classSpecs of some type which are in the given module, recusively listing its children -->
<xsl:template name="print-class-entry">
<xsl:param name="module"/>
<xsl:param name="super"/>
<xsl:param name="classtype"/>
<xsl:param name="indentation"/>
<xsl:variable name="this" select="."/>
<xsl:variable name="parents" select="//tei:classSpec[@type=$classtype][@ident = $this/tei:classes/tei:memberOf/@key]"/>
<xsl:variable name="children" select="//tei:classSpec[tei:classes/tei:memberOf/@key = $this/@ident]"/>
<xsl:value-of select="$indentation"/>
<xsl:text>- </xsl:text>
<xsl:if test="@module != $module">
<xsl:text>[</xsl:text>
</xsl:if>
<xsl:call-template name="print-class">
<xsl:with-param name="explicit_module" select="@module != $module"/>
<xsl:with-param name="list_members" select="1"/>
</xsl:call-template>
<!-- show hint in case this class is used by other modules -->
<xsl:if test="$children[@ident != $super][@module != $module]">
<xsl:text> [included by </xsl:text>
<xsl:for-each select="$children[@ident != $super][@module != $module]">
<xsl:call-template name="print-class">
<xsl:with-param name="explicit_module" select="1"/>
<xsl:with-param name="module" select="$module"/>
</xsl:call-template>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text>]</xsl:text>
</xsl:if>
<xsl:if test="@module != $module">
<xsl:text>]</xsl:text>
</xsl:if>
<!-- only list parents, if this element is part of the current module
(otherwise they are to be listed in an other module)
-->
<xsl:if test="@module = $module">
<xsl:for-each select="$parents">
<xsl:value-of select="$newline"/>
<xsl:call-template name="print-class-entry">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="classtype" select="$classtype"/>
<xsl:with-param name="indentation" select="concat($indentation,' ')"/>
<xsl:with-param name="super" select="$this/@ident"/>
</xsl:call-template>
</xsl:for-each>
</xsl:if>
</xsl:template>
<!-- print an elementSpec, optionally prefixed by its module: -->
<xsl:template name="print-element">
<xsl:param name="explicit_module"/>
<xsl:if test="$explicit_module">
<xsl:value-of select="@module"/>
<xsl:text>::</xsl:text>
</xsl:if>
<xsl:value-of select="@ident"/>
</xsl:template>
<!-- print an classSpec, optionally prefixed by its module: -->
<xsl:template name="print-class">
<xsl:param name="explicit_module" select="0"/>
<xsl:param name="module"/>
<!-- 0: don't list, 1: yes, 2: recursive -->
<xsl:param name="list_members"/>
<xsl:variable name="classtype" select="@type"/>
<xsl:if test="$explicit_module">
<xsl:value-of select="@module"/>
<xsl:text>::</xsl:text>
</xsl:if>
<xsl:value-of select="@ident"/>
<!-- list elements / attributes in this class -->
<xsl:if test="$list_members">
<xsl:text> (</xsl:text>
<xsl:choose>
<xsl:when test="$classtype = 'model'">
<xsl:call-template name="print-class-elements">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="recursive" select="$list_members = 2"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="print-class-attributes">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="recursive" select="$list_members = 2"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:text>)</xsl:text>
</xsl:if>
</xsl:template>
<!-- print a list of elementSpecs which are members of the classSpec in the current context: -->
<xsl:template name="print-class-elements">
<xsl:param name="module"/>
<xsl:param name="recursive" select='0'/>
<xsl:variable name="this" select="."/>
<xsl:for-each select="//tei:elementSpec[tei:classes/tei:memberOf/@key=$this/@ident]">
<xsl:call-template name="print-element">
<xsl:with-param name="explicit_module" select="@module != $module"/>
</xsl:call-template>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="$recursive">
<!--
<xsl:text> (</xsl:text>
-->
<xsl:for-each select="//tei:classSpec[@ident = $this/tei:classes/tei:memberOf/@key]">
<xsl:call-template name="print-class-elements">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="recursive" select="$recursive"/>
</xsl:call-template>
</xsl:for-each>
<!--
<xsl:text>)</xsl:text>
-->
</xsl:if>
</xsl:for-each>
</xsl:template>
<!-- print a list of attDefs which are members of the classSpec in the current context: -->
<xsl:template name="print-class-attributes">
<xsl:param name="module"/>
<xsl:param name="recursive" select='0'/>
<xsl:variable name="this" select="."/>
<xsl:for-each select="tei:attList/tei:attDef/@ident">
<xsl:text>@</xsl:text>
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:if test="$recursive">
<xsl:if test="tei:attList/tei:attDef/@ident and //tei:classSpec[@ident = $this/tei:classes/tei:memberOf/@key]">
<xsl:text>, </xsl:text>
</xsl:if>
<!--
<xsl:text> sub(</xsl:text>
<xsl:for-each select="//tei:classSpec[tei:classes/tei:memberOf/@key = $this/@ident]">
-->
<xsl:for-each select="//tei:classSpec[@ident = $this/tei:classes/tei:memberOf/@key]">
<xsl:call-template name="print-class-attributes">
<xsl:with-param name="module" select="$module"/>
<xsl:with-param name="recursive" select="$recursive"/>
</xsl:call-template>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each>
<!--
<xsl:text>)</xsl:text>
-->
</xsl:if>
</xsl:template>
</xsl:stylesheet>