<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:kiln="http://www.kcl.ac.uk/artshums/depts/ddh/kiln/ns/1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <!-- Transform a menu document into a normalised form, with all
       hrefs expanded into full root relative paths. -->

  <xsl:import href="cocoon://_internal/template/xsl/stylesheets/defaults.xsl"><xsl:stylesheet xmlns:xi="http://www.w3.org/2001/XInclude" exclude-result-prefixes="#all" version="2.0">
  <!--
      Defaults stylesheet. Defines default globals and reads
      parameters from the sitemap.
  -->

  <xsl:param name="language"/>

  <!-- Specify a mount path if you are mounting the webapp in a
       subdirectory rather than at the root of the domain. This path
       must either be empty or begin with a "/" and not include a
       trailing slash.

       The value is the URL root for the webapp. -->
  <xsl:variable name="kiln:mount-path" select="''"/>

  <!-- $kiln:context-path defines the URL root for the webapp. -->
  <xsl:variable name="kiln:context-path">
    <xsl:value-of select="$kiln:mount-path"/>
  </xsl:variable>

  <!-- Base URL for non-textual content (images, video, etc). If these
       are being served by Cocoon, this should be specified as
       relative to $context-path. Otherwise, a full URL including
       protocol and domain is required.

       This URL must not include a trailing slash. -->
  <xsl:variable name="kiln:content-url" select="''"/>
  <xsl:variable name="kiln:content-path">
    <xsl:if test="not(starts-with($kiln:content-url, 'http'))">
      <xsl:value-of select="$kiln:mount-path"/>
    </xsl:if>
    <xsl:value-of select="$kiln:content-url"/>
  </xsl:variable>

  <!-- Base URL for assets (non-content images, CSS, JavaScript,
       etc). If these are being served by Cocoon, this should be
       specified as relative to $context-path. Otherwise, a full URL
       including protocol and domain is required.

       This URL must not include a trailing slash. -->
  <xsl:variable name="kiln:assets-url" select="'/assets'"/>
  <xsl:variable name="kiln:assets-path">
    <xsl:if test="not(starts-with($kiln:assets-url, 'http'))">
      <xsl:value-of select="$kiln:mount-path"/>
    </xsl:if>
    <xsl:value-of select="$kiln:assets-url"/>
  </xsl:variable>

  <!-- Base URL for content images. -->
  <xsl:variable name="kiln:images-url" select="concat($kiln:content-path, '/images')"/>
  <xsl:variable name="kiln:images-path">
    <xsl:if test="not(starts-with($kiln:images-url, 'http'))">
      <xsl:value-of select="$kiln:mount-path"/>
    </xsl:if>
    <xsl:value-of select="$kiln:images-url"/>
  </xsl:variable>

</xsl:stylesheet></xsl:import>

  <xsl:import href="cocoon://_internal/url/reverse.xsl"><xsl:stylesheet xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:map="http://apache.org/cocoon/sitemap/1.0" exclude-result-prefixes="#all" version="2.0"><xsl:function name="kiln:url-for-match" as="xs:string"><xsl:param name="match-id" as="xs:string"/><xsl:param name="parameters"/><xsl:param name="cocoon-context"/><xsl:variable name="url"><xsl:choose><xsl:when test="$match-id = 'kiln-introspection-match-url'"><xsl:text>cocoon://</xsl:text><xsl:text>_internal/introspection/url/</xsl:text><xsl:value-of select="$parameters[2-1]"/></xsl:when><xsl:when test="$match-id = 'local-rdf-harvest-all-display'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/harvest/all.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-harvest-all'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/harvest/all.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-harvest-display'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/harvest/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-harvest'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/harvest/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-query'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/query/graph/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-generate-authority'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/generate/authority/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-generate-epidoc'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/generate/epidoc/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-generate-index'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/generate/indices/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-generate-tei'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/generate/tei/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-generate-static'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/generate/rdf/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-rdf-query-from-file'"><xsl:text>/</xsl:text><xsl:text>admin/rdf/construct/graph/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-site-list'"><xsl:text>/</xsl:text><xsl:text>admin/solr/index/site-list.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-index-all'"><xsl:text>/</xsl:text><xsl:text>admin/solr/index/all.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-index-indices'"><xsl:text>/</xsl:text><xsl:text>admin/solr/index/indices/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-index'"><xsl:text>/</xsl:text><xsl:text>admin/solr/index/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-add-all-indices'"><xsl:text>/</xsl:text><xsl:text>admin/solr/add/indices/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-add-all'"><xsl:text>/</xsl:text><xsl:text>admin/solr/add/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-add-tei-eats'"><xsl:text>/</xsl:text><xsl:text>admin/solr/add/tei-eats/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-add-tei-eats-authority'"><xsl:text>/</xsl:text><xsl:text>admin/solr/add/tei-eats-authority/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-add-indices'"><xsl:text>/</xsl:text><xsl:text>admin/solr/add/indices/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-add-index'"><xsl:text>/</xsl:text><xsl:text>admin/solr/add/indices/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-add-bibliographic-concordance'"><xsl:text>/</xsl:text><xsl:text>admin/solr/add/concordance/authority/bibliography.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-add'"><xsl:text>/</xsl:text><xsl:text>admin/solr/add/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-preprocess-tei-eats'"><xsl:text>/</xsl:text><xsl:text>admin/solr/preprocess/tei-eats/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-preprocess-eatsml'"><xsl:text>/</xsl:text><xsl:text>admin/solr/preprocess/eatsml/entities.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-preprocess-eatsml-authority'"><xsl:text>/</xsl:text><xsl:text>admin/solr/preprocess/eatsml/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/entities.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-solr-preprocess'"><xsl:text>/</xsl:text><xsl:text>admin/solr/preprocess/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-home-page'"><xsl:text>/</xsl:text><xsl:text>admin/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-system-status'"><xsl:text>/</xsl:text><xsl:text>admin/system-status.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-introspection-index'"><xsl:text>/</xsl:text><xsl:text>admin/introspection/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-introspection-match'"><xsl:text>/</xsl:text><xsl:text>admin/introspection/match/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-introspection-template-empty'"><xsl:text>/</xsl:text><xsl:text>admin/introspection/template/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-introspection-template-xslt'"><xsl:text>/</xsl:text><xsl:text>admin/introspection/template/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xsl</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-introspection-xslt'"><xsl:text>/</xsl:text><xsl:text>admin/introspection/xslt/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xsl</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-introspection-match-url'"><xsl:text>/</xsl:text><xsl:text>admin/introspection/url/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-schematron-validation'"><xsl:text>/</xsl:text><xsl:text>admin/schematron/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-resource-check'"><xsl:text>/</xsl:text><xsl:text>admin/resource-check/images/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-image-resource-check'"><xsl:text>cocoon://</xsl:text><xsl:text>admin/resource-check/images/tei/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-image-reference-check'"><xsl:text>cocoon://</xsl:text><xsl:text>admin/resource-check/image-refs/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-admin-image-file-check'"><xsl:text>cocoon://</xsl:text><xsl:text>admin/resource-check/image-files.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-preprocess-tei-no-language'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/tei/preprocess/no-language/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-preprocess-epidoc-no-language'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/epidoc/preprocess/no-language/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-preprocess-tei-language'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/tei/preprocess/language/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-preprocess-epidoc-language'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/epidoc/preprocess/language/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-preprocess-authority-language'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/authority/preprocess/language/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-epidoc-custom-html'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/epidoc/custom/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-search-query'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/search/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-index-extract'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/index/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-typed-metadata'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/metadata/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-metadata'"><xsl:text>cocoon://</xsl:text><xsl:text>internal/metadata/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-images-gif'"><xsl:text>/</xsl:text><xsl:text>images/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.gif</xsl:text></xsl:when><xsl:when test="$match-id = 'local-images-jpeg-thumbnail'"><xsl:text>/</xsl:text><xsl:text>images/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>-thumb.jpg</xsl:text></xsl:when><xsl:when test="$match-id = 'local-images-jpeg'"><xsl:text>/</xsl:text><xsl:text>images/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.jpg</xsl:text></xsl:when><xsl:when test="$match-id = 'local-images-png'"><xsl:text>/</xsl:text><xsl:text>images/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.png</xsl:text></xsl:when><xsl:when test="$match-id = 'local-home-page'"><xsl:text>/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-language-home-page'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-search'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/search/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-map'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/map/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-about'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/about/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-about-page'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/about/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-tei-index-display'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/texts/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-tei-display-html'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/texts/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-tei-display-xml'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/texts/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-tei-display-pdf'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/texts/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.pdf</xsl:text></xsl:when><xsl:when test="$match-id = 'local-tei-display-epub'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/texts/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.epub</xsl:text></xsl:when><xsl:when test="$match-id = 'local-epidoc-index-display'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/seals/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-epidoc-zip'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/seals/zip/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-epidoc-display-html'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/seals/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-epidoc-display-xml'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/seals/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.xml</xsl:text></xsl:when><xsl:when test="$match-id = 'local-indices-type-display'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/indices/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-index-display-html'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/indices/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>/</xsl:text><xsl:value-of select="$parameters[4-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-concordance-bibliography'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/concordances/bibliography/</xsl:text></xsl:when><xsl:when test="$match-id = 'local-concordance-bibliography-item'"><xsl:text>/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>/concordance/bibliography/</xsl:text><xsl:value-of select="$parameters[3-1]"/><xsl:text>.html</xsl:text></xsl:when><xsl:when test="$match-id = 'local-tei-backend-xml'"><xsl:text>/</xsl:text><xsl:text>text/</xsl:text><xsl:value-of select="$parameters[2-1]"/><xsl:text>.xml</xsl:text></xsl:when></xsl:choose></xsl:variable><xsl:variable name="full-url"><xsl:if test="$cocoon-context and not(starts-with($url, 'cocoon://'))">cocoon:/</xsl:if><xsl:value-of select="$url"/></xsl:variable><xsl:value-of select="$full-url"/></xsl:function></xsl:stylesheet></xsl:import>

  <xsl:param name="url"/>
  <xsl:variable name="full-url" select="concat('/', $url)"/>

  <xsl:template match="kiln:menu[not(@href)][not(@match)][not(@language_switch)]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:call-template name="make-full-href">
        <xsl:with-param name="attribute" select="*[1]/@href"/>
      </xsl:call-template>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@href">
    <xsl:choose>
      <xsl:when test="contains(., '://')">
        <xsl:copy-of select="."/>
      </xsl:when>
      <xsl:when test="starts-with(., '//')">
        <xsl:copy-of select="."/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="make-full-href">
          <xsl:with-param name="attribute" select="."/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <!-- Link target is the current URL with a different language
       code. Rather than be always correct but slow (by using
       introspection to look up the current URL to get the map:match
       ID and the path variables), just assume that the language code
       appears once and perform string manipulation on the current
       URL. -->
  <xsl:template match="@language_switch">
    <xsl:variable name="url-start" select="substring-before($full-url,                   concat('/', $language, '/'))"/>
    <xsl:variable name="url-end" select="substring-after($full-url,                  concat($url-start, '/', $language))"/>
    <xsl:choose>
      <xsl:when test=". = $language">
        <xsl:attribute name="delete" select="'delete'"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:attribute name="href">
          <xsl:text>/</xsl:text>
          <xsl:value-of select="$url-start"/>
          <xsl:value-of select="."/>
          <xsl:value-of select="if (string($url-end)) then $url-end else '/'"/>
        </xsl:attribute>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="@match">
    <!-- Use the language code in @language if present; otherwise, the
         language supplied to the XSLT. This allows for a menu item to
         reference a URL in a different language. -->
    <xsl:variable name="language-code">
      <xsl:choose>
        <xsl:when test="../@language">
          <xsl:value-of select="../@language"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$language"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:attribute name="href">
      <xsl:value-of select="kiln:url-for-match(., tokenize(normalize-space(concat($language-code, ' ', ../@params)), '\s+'), 0)"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template name="make-full-href">
    <!-- $attribute is an @href attribute. -->
    <xsl:param name="attribute"/>
    <xsl:variable name="path">
      <xsl:choose>
        <xsl:when test="starts-with($attribute, '/')">
          <xsl:value-of select="$kiln:context-path"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:call-template name="get-path">
            <xsl:with-param name="context" select="$attribute"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:attribute name="href">
      <xsl:value-of select="$path"/>
      <xsl:if test="not(starts-with($attribute, '/'))">
        <xsl:text>/</xsl:text>
      </xsl:if>
      <xsl:value-of select="$attribute"/>
    </xsl:attribute>
    <xsl:attribute name="path">
      <xsl:value-of select="$path"/>
    </xsl:attribute>
  </xsl:template>

  <xsl:template name="get-path">
    <xsl:param name="context"/>
    <xsl:value-of select="$kiln:context-path"/>
    <xsl:for-each select="$context/ancestor-or-self::*[@root]">
      <xsl:text>/</xsl:text>
      <xsl:value-of select="@root"/>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>