<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
   version="1.0" >

<xsl:key name="namespaces" match="//*|//@*" use="namespace-uri()"/>

<xsl:template name="get-prefix">
   <xsl:param name="uri"/>
   <xsl:variable name="racine" select="substring-before($uri, '#')"/>
   <xsl:variable name="namespace" select="concat($racine, '#')"/>
   <xsl:variable name="name" select="name(key('namespaces', $namespace))"/>
   <xsl:value-of select="substring-before($name, ':')"/>
</xsl:template>

<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" 
      xml:lang="en-GB" >

<head>
<title>EARL RDF Schema</title>
<style type="text/css">
body { margin: 1em; font-family: Georgia, sans-serif; }
h1 { font-family: Tahoma, sans-serif; }
h2, h3, h4, h5, h6 { font-family: Arial, sans-serif; }
a { font-weight: bold; color: #036; }
dt.class { margin-top: 0.75em; }
dt.property { margin-top: 0.75em; }
address { padding-top: 0.35em; border-top: 2px solid #369; }
</style>
</head>
<body>
<h1>EARL RDF Schema</h1>

<h2>RDFS Classes</h2>
<ul id="classes">
<xsl:for-each select="//rdfs:Class">
<xsl:variable name="uri" select="@rdf:about"/>
<xsl:variable name="name" select="substring-after($uri, '#')"/>
<xsl:variable name="prefix"><xsl:call-template name="get-prefix">
   <xsl:with-param name="uri" select="$uri"/>
</xsl:call-template></xsl:variable>
<li><dl>
<dt id="{$name}" class="class"><xsl:value-of select="$prefix"/>:<a 
    href="#{$name}"><xsl:value-of select="$name"/></a><xsl:if 
        test="./rdfs:subClassOf">(<xsl:call-template name="get-prefix">
      <xsl:with-param name="uri" select="./rdfs:subClassOf/@rdf:resource"/>
    </xsl:call-template>:<xsl:value-of 
        select="substring-after(./rdfs:subClassOf/@rdf:resource, '#')"/>)
   </xsl:if>
</dt>
<xsl:for-each select="//rdf:Property">
   <xsl:if test="./rdfs:domain/@rdf:resource = $uri">
     <dd><xsl:call-template name="get-prefix"><xsl:with-param name="uri" 
       select="@rdf:about"/></xsl:call-template>:<a 
       href="#{substring-after(@rdf:about, '#')}"><xsl:value-of 
             select="substring-after(@rdf:about, '#')"/></a> => 
      <xsl:call-template name="get-prefix">
      <xsl:with-param name="uri" select="./rdfs:range/@rdf:resource"/>
    </xsl:call-template>:<xsl:value-of 
             select="substring-after(./rdfs:range/@rdf:resource, '#')"/></dd>
   </xsl:if>
</xsl:for-each>
</dl></li>
</xsl:for-each>
</ul>

<h2>Properties</h2>
<dl>
<xsl:for-each select="//rdf:Property">
<xsl:variable name="uri" select="@rdf:about"/>
<xsl:variable name="name" select="substring-after($uri, '#')"/>
<xsl:variable name="prefix"><xsl:call-template name="get-prefix">
   <xsl:with-param name="uri" select="$uri"/>
</xsl:call-template></xsl:variable>

<dt id="{$name}" class="property"><xsl:value-of select="$prefix"/>:<a 
    href="#{$name}"><xsl:value-of select="$name"/></a></dt>
<xsl:if test="./rdfs:domain/@rdf:resource">
   <xsl:variable name="domain" select="./rdfs:domain/@rdf:resource"/>
   <dd>domain: <xsl:call-template name="get-prefix"><xsl:with-param 
       name="uri" select="$domain"/></xsl:call-template>:<xsl:value-of 
       select="substring-after($domain, '#')"/></dd>
</xsl:if>
<xsl:if test="./rdfs:range/@rdf:resource">
   <xsl:variable name="range" select="./rdfs:domain/@rdf:resource"/>
   <dd>range: <xsl:call-template name="get-prefix"><xsl:with-param 
       name="uri" select="$range"/></xsl:call-template>:<xsl:value-of 
       select="substring-after($range, '#')"/></dd>
</xsl:if>

</xsl:for-each>
</dl>

<h2>Instances</h2>
<xsl:for-each select="//rdfs:Class">
   <xsl:variable name="name" select="substring-after(@rdf:about, '#')"/>
   <xsl:variable name="prefix"><xsl:call-template name="get-prefix">
       <xsl:with-param name="uri" select="@rdf:about"/>
   </xsl:call-template></xsl:variable>
   <xsl:variable name="qname" select="concat($prefix, ':', $name)"/>
   <dl><div class=""> </div>
   <xsl:for-each select="/rdf:RDF/*">
      <xsl:if test="name() = $qname">
        <xsl:variable name="tname" select="substring-after(@rdf:about, '#')"/>
          <dt class="instance"><xsl:value-of select="$prefix"/>:<xsl:value-of 
              select="local-name()"/> -> <xsl:value-of select="$prefix"/>:<a 
              href="#{$tname}"><xsl:value-of select="$tname"/></a>
          </dt>
      </xsl:if>
   </xsl:for-each>
   </dl>
</xsl:for-each>

<p>@@ Get the other properties of instances.</p>

<address>
Generated from RDF via some XSLT stylesheet by <a 
href="http://purl.org/net/sbp/">sbp</a>
</address>
</body>
</html>
</xsl:template>

<xsl:template match="text()|@*"/>

</xsl:stylesheet>
