<?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:db="http://docbook.org/ns/docbook"
		xmlns="http://www.w3.org/1999/xhtml"
		xmlns:html="http://www.w3.org/1999/xhtml"
		xmlns:t="http://docbook.org/xslt/ns/template"
		exclude-result-prefixes="xs db html t"
                version="2.0">

<xsl:import href="docbook.xsl"/>

<xsl:param name="refentry.generate.name" select="0"/>
<xsl:param name="refentry.generate.title" select="1"/>
<xsl:param name="docbook.css" select="'vcard.css'"/>
<xsl:param name="refentry.separator" select="0"/>

<xsl:key name="domain" match="db:refentry"
	 use=".//db:classname[parent::db:para[@role='domain' and parent::db:listitem[parent::db:itemizedlist[@role='constraints']]]][1]"/>
<xsl:key name="subPropertyOf" match="db:refentry"
	 use="db:refmeta/db:refmiscinfo[@role='rdfs:subPropertyOf']"/>

<xsl:template match="db:refentry">
  <xsl:variable name="recto"
		select="$titlepages/*[node-name(.) = node-name(current())
			              and @t:side='recto'][1]"/>
  <xsl:variable name="verso"
		select="$titlepages/*[node-name(.) = node-name(current())
			              and @t:side='verso'][1]"/>

  <div class="{local-name(.)}">
    <xsl:call-template name="id">
      <xsl:with-param name="force" select="1"/>
    </xsl:call-template>

    <xsl:if test="$refentry.separator != 0 and preceding-sibling::db:refentry">
      <div class="refentry-separator">
	<hr/>
      </div>
    </xsl:if>

    <xsl:call-template name="titlepage">
      <xsl:with-param name="content" select="$recto"/>
    </xsl:call-template>

    <xsl:if test="not(empty($verso))">
      <xsl:call-template name="titlepage">
	<xsl:with-param name="content" select="$verso"/>
      </xsl:call-template>
    </xsl:if>

    <xsl:apply-templates/>

    <xsl:choose>
      <xsl:when test="db:refmeta/db:refmiscinfo[@role='rdf:type'] = 'owl:Class'">
	<xsl:variable name="properties" select="key('domain',db:refnamediv/db:refname)"/>
	<xsl:if test="$properties">
	  <div class="refsection">
	    <h3>Properties</h3>
	    <p>
	      <xsl:text>The following properties have a domain of </xsl:text>
	      <code><xsl:value-of select="db:refnamediv/db:refname"/></code>
	      <xsl:text>: </xsl:text>
	      <xsl:for-each select="$properties">
		<xsl:sort select="db:refnamediv/db:refname"/>
		<code class="property">
		  <a href="#{@xml:id}">
		    <xsl:value-of select="db:refnamediv/db:refname"/>
		  </a>
		  <xsl:if test="position() &lt; last()">, </xsl:if>
		</code>
	      </xsl:for-each>
	    </p>
	  </div>
	</xsl:if>
      </xsl:when>
      <xsl:when test="db:refmeta/db:refmiscinfo[@role='rdf:type'] = 'owl:DatatypeProperty'">
      </xsl:when>
      <xsl:when test="db:refmeta/db:refmiscinfo[@role='rdf:type'] = 'owl:ObjectProperty'">
      </xsl:when>
    </xsl:choose>

    <xsl:if test="db:refmeta/db:refmiscinfo[@role='rdfs:subPropertyOf']
		  |key('subPropertyOf',db:refnamediv/db:refname)">
      <div class="refsection">
	<h3>Properties</h3>
	<xsl:if test="db:refmeta/db:refmiscinfo[@role='rdfs:subPropertyOf']">
	  <p>
	    <xsl:text>The </xsl:text>
	    <code><xsl:value-of select="db:refnamediv/db:refname"/></code>
	    <xsl:text> property is a subproperty of: </xsl:text>
	    <xsl:for-each select="db:refmeta/db:refmiscinfo[@role='rdfs:subPropertyOf']">
	      <xsl:sort select="."/>
	      <code class="property">
		<a href="#{substring-after(.,'v:')}">
		  <xsl:value-of select="."/>
		</a>
		<xsl:if test="position() &lt; last()">, </xsl:if>
	      </code>
	    </xsl:for-each>
	  </p>
	</xsl:if>
	
	<xsl:if test="key('subPropertyOf',db:refnamediv/db:refname)">
	  <p>
	    <xsl:text>The </xsl:text>
	    <code><xsl:value-of select="db:refnamediv/db:refname"/></code>
	    <xsl:text> property has subproperties: </xsl:text>
	    <xsl:for-each select="key('subPropertyOf',db:refnamediv/db:refname)">
	      <xsl:sort select="db:refnamediv/db:refname"/>
	      <code class="property">
		<a href="#{@xml:id}">
		  <xsl:value-of select="db:refnamediv/db:refname"/>
		</a>
		<xsl:if test="position() &lt; last()">, </xsl:if>
	      </code>
	    </xsl:for-each>
	  </p>
	</xsl:if>
      </div>
    </xsl:if>

    <xsl:if test="db:refmeta/db:refmiscinfo[@role='rfc2426']">
      <xsl:variable name="ref" select="db:refmeta/db:refmiscinfo[@role='rfc2426']"/>
      <xsl:variable name="link" select="db:refmeta/db:refmiscinfo[@role='rfc2426.link']"/>

      <div class="refsection">
	<h3>See also</h3>
	<p>
	  <xsl:if test="$link">
	    <xsl:value-of select="$link"/>
	    <xsl:text> </xsl:text>
	  </xsl:if>
	  <a href="http://www.w3.org/2002/12/cal/rfc2426#{$ref}">
	    <xsl:text>Section </xsl:text>
	    <xsl:value-of select="substring-after($ref,'sec')"/>
	    <xsl:text> of RFC 2426</xsl:text>
	  </a>
	  <xsl:text>.</xsl:text>
	</p>
      </div>
    </xsl:if>
  </div>
</xsl:template>

<xsl:template match="db:classname|db:property">
  <code class="{local-name(.)}">
    <xsl:choose>
      <xsl:when test="not(starts-with(.,'v:'))">
	<xsl:apply-templates/>
      </xsl:when>
      <xsl:when test="ancestor::db:refentry/@xml:id = substring-after(.,'v:')">
	<xsl:apply-templates/>
      </xsl:when>
      <xsl:otherwise>
	<a href="#{substring-after(.,'v:')}">
	  <xsl:apply-templates/>
	</a>
      </xsl:otherwise>
    </xsl:choose>
  </code>
</xsl:template>

<!-- ============================================================ -->

<xsl:template match="db:revhistory">
  <dl class="revhistory">
    <xsl:apply-templates/>
  </dl>
</xsl:template>

<xsl:template match="db:revision">
  <dt>
    <xsl:apply-templates select="db:date"/>
    <xsl:if test="db:authorinitials">
      <xsl:text>, </xsl:text>
      <xsl:apply-templates select="db:authorinitials"/>
    </xsl:if>
  </dt>
  <xsl:apply-templates select="db:revdescription"/>
</xsl:template>

<xsl:template match="db:revdescription">
  <dd>
    <xsl:apply-templates/>
  </dd>
</xsl:template>

</xsl:stylesheet>

