<xsl:stylesheet xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="mods" version="1.0">
<xsl:output indent="yes" method="html"/>
<xsl:variable name="dictionary" select="document('http://www.loc.gov/standards/mods/modsDictionary.xml')/dictionary"/>

<xsl:template match="/">
<html>
<head>
<style type="text/css">
.modsLabelTop {
}

.modsLabelLevel2 {
  padding-left: 10px;
}

.modsLabelLevel3 {
  padding-left: 20px;
}

.modsLabelLevel4 {
  padding-left: 30px;
}

.modsValueTop {
}

.modsValueLevel2 {
}

.modsValueLevel3 {
}

</style>
</head>
<body>
  <xsl:choose>
    <xsl:when test="mods:modsCollection">
      <xsl:apply-templates select="mods:modsCollection"/>
    </xsl:when>
    <xsl:when test="mods:mods">
      <xsl:apply-templates select="mods:mods"/>
    </xsl:when>
  </xsl:choose>
</body>
</html>
</xsl:template>

<xsl:template match="mods:modsCollection">
  <xsl:apply-templates select="mods:mods"/>
</xsl:template>

<xsl:template match="mods:mods">
  <table class="modsContainer">
  <xsl:apply-templates/>
  </table>
  <!--hr/-->
</xsl:template>

<xsl:template match="*">
  <xsl:choose>
    <xsl:when test="child::*">
      <tr><td colspan="2">
      <span class="modsLabelTop">
      <xsl:call-template name="longName">
        <xsl:with-param name="name">
          <xsl:value-of select="local-name()"/>:
        </xsl:with-param>
      </xsl:call-template>
      <xsl:call-template name="attr"/>
      </span>
      </td></tr>
      <xsl:apply-templates mode="level2"/>
    </xsl:when>
    <xsl:otherwise>
      <tr><td>
      <span class="modsLabelTop">
      <xsl:call-template name="longName">
        <xsl:with-param name="name">
          <xsl:value-of select="local-name()"/>
        </xsl:with-param>
      </xsl:call-template>
      <xsl:call-template name="attr"/>
      </span>
      </td><td>
      <span class="modsValueTop">
      <xsl:call-template name="formatValue"/>
      </span>
      </td></tr>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="formatValue">
  <xsl:choose>
    <xsl:when test="@type='uri'">
      <a href="{text()}" class="modsLink">
      <xsl:value-of select="text()"/>
      </a>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="text()"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="*" mode="level2">
  <xsl:choose>
    <xsl:when test="child::*">
      <tr><td colspan="2">
      <span class="modsLabelLevel2">
      <xsl:call-template name="longName">
        <xsl:with-param name="name">
          <xsl:value-of select="local-name()"/>
        </xsl:with-param>
      </xsl:call-template>
      <xsl:call-template name="attr"/>
      </span>
      </td></tr>
      <xsl:apply-templates mode="level3"/>
    </xsl:when>
    <xsl:otherwise>
      <tr><td>
      <span class="modsLabelLevel2">
      <xsl:call-template name="longName">
        <xsl:with-param name="name">
          <xsl:value-of select="local-name()"/>
        </xsl:with-param>
      </xsl:call-template>
      <xsl:call-template name="attr"/>
      </span>
      </td><td>
      <span class="modsValueLevel2">
      <xsl:call-template name="formatValue"/>
      </span>
      </td></tr>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="*" mode="level3">
  <xsl:choose>
    <xsl:when test="child::*">
      <tr><td colspan="2">
      <span class="modsLabelLevel3">
      <xsl:call-template name="longName">
        <xsl:with-param name="name">
          <xsl:value-of select="local-name()"/>
        </xsl:with-param>
      </xsl:call-template>
      <xsl:call-template name="attr"/>
      </span>
      </td></tr>
      <xsl:apply-templates mode="level4"/>
    </xsl:when>
    <xsl:otherwise>
      <tr><td>
      <span class="modsLabelLevel3">
      <xsl:call-template name="longName">
        <xsl:with-param name="name">
          <xsl:value-of select="local-name()"/>
        </xsl:with-param>
      </xsl:call-template>
      <xsl:call-template name="attr"/>
      </span>
      </td><td>
      <span class="modsValueLevel3">
      <xsl:call-template name="formatValue"/>
      </span>
      </td></tr>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="*" mode="level4">
  <tr><td>
  <span class="modsLabelLevel4">
  <xsl:call-template name="longName">
    <xsl:with-param name="name">
      <xsl:value-of select="local-name()"/>
    </xsl:with-param>
  </xsl:call-template>
  <xsl:call-template name="attr"/>
  </span>
  </td><td>
  <span class="modsValueLevel4">
  <xsl:value-of select="text()"/>
  </span>
  </td></tr>
</xsl:template>

<xsl:template name="longName">
  <xsl:param name="name"/>
  <xsl:choose>
    <xsl:when test="$dictionary/entry[@key=$name]">
      <xsl:value-of select="$dictionary/entry[@key=$name]"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$name"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="attr">
  <xsl:for-each select="@type|@point">:
    <xsl:call-template name="longName">
      <xsl:with-param name="name">
        <xsl:value-of select="."/>
      </xsl:with-param>
    </xsl:call-template>
  </xsl:for-each>
  <xsl:if test="@authority or @edition">
    <xsl:for-each select="@authority">(<xsl:call-template name="longName">
        <xsl:with-param name="name">
          <xsl:value-of select="."/>
        </xsl:with-param>
      </xsl:call-template>
    </xsl:for-each>
    <xsl:if test="@edition">
      Edition <xsl:value-of select="@edition"/>
    </xsl:if>)
  </xsl:if>
  <xsl:variable name="attrStr">
    <xsl:for-each select="@*[local-name()!='edition' and local-name()!='type' and local-name()!='authority' and local-name()!='point']">
      <xsl:value-of select="local-name()"/>="<xsl:value-of select="."/>",
    </xsl:for-each>
  </xsl:variable>
  <xsl:variable name="nattrStr" select="normalize-space($attrStr)"/>
    <xsl:if test="string-length($nattrStr)">
      (<xsl:value-of select="substring($nattrStr,1,string-length($nattrStr)-1)"/>)
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>