Skip to content

Instantly share code, notes, and snippets.

@raffazizzi
Last active May 3, 2020 16:40
Show Gist options
  • Save raffazizzi/8fa96c163a01090afc2358577070917a to your computer and use it in GitHub Desktop.
Save raffazizzi/8fa96c163a01090afc2358577070917a to your computer and use it in GitHub Desktop.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:tei="http://www.tei-c.org/ns/1.0"
exclude-result-prefixes="xs math"
version="2.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="members">
<xsl:for-each select="//tei:memberOf">
<xsl:element name="memberOf" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="key" select="data(@key)"/>
<xsl:attribute name="module" select="ancestor::*[@module]/@module"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="classRefs">
<xsl:for-each select="//tei:classRef">
<xsl:element name="classRef" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="key" select="data(@key)"/>
<xsl:attribute name="module" select="ancestor::*[@module]/@module"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="dataRefs">
<xsl:for-each select="//tei:dataRef">
<xsl:element name="dataRef" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="key" select="data(@key)"/>
<xsl:attribute name="module" select="ancestor::*[@module]/@module"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="macroRefs">
<xsl:for-each select="//tei:macroRef">
<xsl:element name="dataRef" namespace="http://www.tei-c.org/ns/1.0">
<xsl:attribute name="key" select="data(@key)"/>
<xsl:attribute name="module" select="ancestor::*[@module]/@module"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:text>
# ATTRIBUTE CLASSES
</xsl:text>
<xsl:for-each-group select="//*[@module][starts-with(@ident, 'att.')]" group-by="@module">
<xsl:text>
</xsl:text>
<xsl:text>## </xsl:text><xsl:value-of select="current-grouping-key()"/>
<xsl:text>
</xsl:text>
<xsl:for-each select="current-group()">
<!-- Determine modules that use it -->
<xsl:variable name="cur_class" select="current()/@ident"/>
<xsl:variable name="modules" as="item()*">
<xsl:for-each select="$members/*">
<xsl:if test="data(@key) = $cur_class">
<xsl:sequence select="data(@module)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:text>* </xsl:text>
<xsl:choose>
<xsl:when test="count(distinct-values($modules)) > 0">
<xsl:if test="count(distinct-values($modules)) = 1 and not(current-grouping-key() = $modules)">**</xsl:if>
<xsl:value-of select="@ident"/>
<xsl:text> (Members are in: </xsl:text><xsl:value-of select="distinct-values($modules)"/><xsl:text>)</xsl:text>
<xsl:if test="count(distinct-values($modules)) = 1 and not(current-grouping-key() = $modules)">**</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@ident"/>
<xsl:text>(No direct members)</xsl:text>
</xsl:otherwise>
</xsl:choose><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each-group>
<xsl:text>
# MODEL CLASSES
</xsl:text>
<xsl:for-each-group select="//*[@module][starts-with(@ident, 'model.')]" group-by="@module">
<xsl:text>
</xsl:text>
<xsl:text>## </xsl:text><xsl:value-of select="current-grouping-key()"/>
<xsl:text>
</xsl:text>
<xsl:for-each select="current-group()">
<!-- Determine modules that use it -->
<xsl:variable name="cur_class" select="current()/@ident"/>
<xsl:variable name="modules" as="item()*">
<xsl:for-each select="$members/*">
<xsl:if test="data(@key) = $cur_class">
<xsl:sequence select="data(@module)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable> <xsl:variable name="references" as="item()*">
<xsl:for-each select="$classRefs/*">
<xsl:if test="data(@key) = $cur_class">
<xsl:sequence select="data(@module)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:text>* </xsl:text><xsl:choose>
<xsl:when test="count(distinct-values($modules)) > 0">
<xsl:if test="count(distinct-values($modules)) = 1 and not(current-grouping-key() = $modules)">**</xsl:if>
<xsl:value-of select="@ident"/>
<xsl:text> (Referenced in: </xsl:text><xsl:value-of select="distinct-values($modules)"/><xsl:text>)</xsl:text>
<xsl:if test="count(distinct-values($modules)) = 1 and not(current-grouping-key() = $modules)">**</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@ident"/>
<xsl:text>(Not referenced)</xsl:text>
</xsl:otherwise>
</xsl:choose><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each-group>
<xsl:text>
# DATATYPES
</xsl:text>
<xsl:for-each-group select="//*[@module][starts-with(@ident, 'teidata.')]" group-by="@module">
<xsl:text>
</xsl:text>
<xsl:text>## </xsl:text><xsl:value-of select="current-grouping-key()"/>
<xsl:text>
</xsl:text>
<xsl:for-each select="current-group()">
<!-- Determine modules that use it -->
<xsl:variable name="cur_class" select="current()/@ident"/>
<xsl:variable name="references" as="item()*">
<xsl:for-each select="$dataRefs/*">
<xsl:if test="data(@key) = $cur_class">
<xsl:sequence select="data(@module)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:text>* </xsl:text><xsl:choose>
<xsl:when test="count(distinct-values($references)) > 0">
<xsl:if test="count(distinct-values($references)) = 1 and not(current-grouping-key() = $references)">**</xsl:if>
<xsl:value-of select="@ident"/>
<xsl:text> (Referenced in: </xsl:text><xsl:value-of select="distinct-values($references)"/><xsl:text>)</xsl:text>
<xsl:if test="count(distinct-values($references)) = 1 and not(current-grouping-key() = $references)">**</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@ident"/>
<xsl:text>(Not referenced)</xsl:text>
</xsl:otherwise>
</xsl:choose><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each-group>
<xsl:text>
# MACROS
</xsl:text>
<xsl:for-each-group select="//*[@module][starts-with(@ident, 'macro.')]" group-by="@module">
<xsl:text>
</xsl:text>
<xsl:text>## </xsl:text><xsl:value-of select="current-grouping-key()"/>
<xsl:text>
</xsl:text>
<xsl:for-each select="current-group()">
<!-- Determine modules that use it -->
<xsl:variable name="cur_class" select="current()/@ident"/>
<xsl:variable name="references" as="item()*">
<xsl:for-each select="$macroRefs/*">
<xsl:if test="data(@key) = $cur_class">
<xsl:sequence select="data(@module)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:text>* </xsl:text><xsl:choose>
<xsl:when test="count(distinct-values($references)) > 0">
<xsl:if test="count(distinct-values($references)) = 1 and not(current-grouping-key() = $references)">**</xsl:if>
<xsl:value-of select="@ident"/>
<xsl:text> (Referenced in: </xsl:text><xsl:value-of select="distinct-values($references)"/><xsl:text>)</xsl:text>
<xsl:if test="count(distinct-values($references)) = 1 and not(current-grouping-key() = $references)">**</xsl:if>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@ident"/>
<xsl:text>(Not referenced)</xsl:text>
</xsl:otherwise>
</xsl:choose><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment