<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xd="http://www.pnp-software.com/XSLTdoc" xmlns:tei="http://www.tei-c.org/ns/1.0" xmlns:edate="http://exslt.org/dates-and-times" exclude-result-prefixes="xd tei edate" extension-element-prefixes="edate" version="1.0">
  
  <xd:doc type="stylesheet">
    
<xd:short> TEI stylesheet dealing with elements from the linking module. </xd:short>
    
<xd:detail> This library is free software; you can redistribute it and/or
      modify it under the terms of the GNU Lesser General Public License as
      published by the Free Software Foundation; either version 2.1 of the
      License, or (at your option) any later version. This library is
      distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
      without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
      PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
      details. You should have received a copy of the GNU Lesser General Public
      License along with this library; if not, write to the Free Software
      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
</xd:detail>
    
<xd:author>See AUTHORS</xd:author>
    
<xd:cvsId>$Id: linking.xsl 4801 2008-09-13 10:05:32Z rahtz $</xd:cvsId>
    
<xd:copyright>2008, TEI Consortium</xd:copyright>
  
</xd:doc>

  
  <xd:doc>
    
<xd:short>Process elements tei:TEI</xd:short>
    
<xd:detail> </xd:detail>
  
</xd:doc>

  
<xsl:template match="tei:TEI" mode="xref">
    
<xsl:apply-templates select="tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title[1]" />
  
</xsl:template>
  
  <xd:doc>
    
<xd:short>Process elements tei:anchor|tei:p in xref mode</xd:short>
    
<xd:detail> </xd:detail>
  
</xd:doc>

  
<xsl:template match="tei:anchor|tei:p" mode="xref">
    
<xsl:text>here</xsl:text>
  
</xsl:template>
  
  <xd:doc>
    
<xd:short>Process elements tei:bibl</xd:short>
    
<xd:detail> </xd:detail>
  
</xd:doc>

  
<xsl:template match="tei:bibl" mode="xref">
    
<xsl:text>[</xsl:text>
    
<xsl:number />
    
<xsl:text>]</xsl:text>
  
</xsl:template>

  
  <xd:doc>
    
<xd:short>Process elements
      tei:div|tei:div0|tei:div1|tei:div2|tei:div3|tei:div4|tei:div5|tei:div6 in
      xref mode
</xd:short>
    
<xd:param name="minimal">whether to make a link with just numbers or with
      text too
</xd:param>
    
<xd:detail> </xd:detail>
  
</xd:doc>

  
<xsl:template match="tei:div|tei:div0|tei:div1|tei:div2|tei:div3|tei:div4|tei:div5|tei:div6" mode="xref">
    
<xsl:param name="minimal">false</xsl:param>
    
<xsl:call-template name="header">
      
<xsl:with-param name="minimal" select="$minimal" />
      
<xsl:with-param name="display">plain</xsl:with-param>
    
</xsl:call-template>
  
</xsl:template>
  
  <xd:doc>
    
<xd:short>Process elements tei:note</xd:short>
    
<xd:detail> </xd:detail>
  
</xd:doc>

  
<xsl:template match="tei:note" mode="xref">
    
<xsl:number level="any" />
  
</xsl:template>
  
  <xd:doc>
    
<xd:short>Process elements tei:ptr|tei:xptr in xref mode</xd:short>
    
<xd:detail> </xd:detail>
  
</xd:doc>

  
<xsl:template match="tei:ptr|tei:xptr">
    
<xsl:call-template name="makeTEILink">
      
<xsl:with-param name="ptr">true</xsl:with-param>
    
</xsl:call-template>
  
</xsl:template>
  
  <xd:doc>
    
<xd:short>Process elements tei:ref|tei:xref</xd:short>
    
<xd:detail> </xd:detail>
  
</xd:doc>

  
<xsl:template match="tei:ref|tei:xref">
    
<xsl:call-template name="makeTEILink">
      
<xsl:with-param name="ptr">false</xsl:with-param>
    
</xsl:call-template>
  
</xsl:template>
  
  <xd:doc>
    
<xd:short>[common] Making a heading for something</xd:short>
    
<xd:param name="minimal">whether to display headings</xd:param>
    
<xd:param name="toc">whether this is making a TOC entry</xd:param>
    
<xd:param name="display">detail of display (full, simple, plain), ie
    whether markup is followed
</xd:param>
    
<xd:detail> </xd:detail>
  
</xd:doc>

  
<xsl:template name="header">
    
<xsl:param name="minimal">false</xsl:param>
    
<xsl:param name="toc" />
    
<xsl:param name="display">full</xsl:param>
    
<xsl:variable name="depth">
      
<xsl:apply-templates mode="depth" select="." />
    
</xsl:variable>
    
<xsl:call-template name="formatHeadingNumber">
      
<xsl:with-param name="toc">
        
<xsl:value-of select="$toc" />
      
</xsl:with-param>
      
<xsl:with-param name="text">
    
<xsl:choose>
      
<xsl:when test="local-name(.) = 'TEI'" />
      
<xsl:when test="local-name(.) = 'TEI.2'" />
      
<xsl:when test="$depth &gt; $numberHeadingsDepth"> </xsl:when>
      
<xsl:when test="ancestor::tei:back">
        
<xsl:if test="not($numberBackHeadings='')">
          
<xsl:call-template name="i18n">
            
<xsl:with-param name="word">appendixWords</xsl:with-param>
          
</xsl:call-template>
          
<xsl:text> </xsl:text>
          
<xsl:call-template name="numberBackDiv" />
          
<xsl:if test="$minimal='false'">
            
<xsl:value-of select="$numberSpacer" />
          
</xsl:if>
        
</xsl:if>
      
</xsl:when>
      
<xsl:when test="ancestor::tei:front">
        
<xsl:if test="not($numberFrontHeadings='')">
          
<xsl:call-template name="numberFrontDiv">
            
<xsl:with-param name="minimal">
              
<xsl:value-of select="$minimal" />
            
</xsl:with-param>
          
</xsl:call-template>
        
</xsl:if>
      
</xsl:when>
      
<xsl:when test="$numberHeadings ='true'">
        
<xsl:choose>
          
<xsl:when test="$prenumberedHeadings='true'">
            
<xsl:value-of select="@n" />
          
</xsl:when>
          
<xsl:otherwise>
            
<xsl:call-template name="numberBodyDiv" />
          
</xsl:otherwise>
        
</xsl:choose>
        
<xsl:if test="$minimal='false'">
          
<xsl:value-of select="$headingNumberSuffix" />
        
</xsl:if>
      
</xsl:when>
    
</xsl:choose>
      
</xsl:with-param>
    
</xsl:call-template>
    
<xsl:if test="$minimal='false'">
      
<xsl:choose>
        
<xsl:when test="local-name(.) = 'TEI' or local-name(.)='TEI.2'">
          
<xsl:apply-templates select="tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title[1]" />
        
</xsl:when>
        
<xsl:when test="not(tei:head) and @n">
          
<xsl:value-of select="@n" />
        
</xsl:when>
        
<xsl:when test="not($toc='')">
          
<xsl:call-template name="makeInternalLink">
            
<xsl:with-param name="dest">
              
<xsl:value-of select="$toc" />
            
</xsl:with-param>
            
<xsl:with-param name="class">
              
<xsl:value-of select="$class_toc" />
              
<xsl:text> </xsl:text>
              
<xsl:value-of select="concat($class_toc,'_',$depth)" />
            
</xsl:with-param>
            
<xsl:with-param name="body">
              
<xsl:choose>
                
<xsl:when test="$autoHead='true'">
                  
<xsl:call-template name="autoMakeHead" />
                
</xsl:when>
                
<xsl:otherwise>
                     
<xsl:apply-templates mode="plain" select="tei:head" />
                
</xsl:otherwise>
              
</xsl:choose>
            
</xsl:with-param>
          
</xsl:call-template>
        
</xsl:when>
        
<xsl:when test="$autoHead='true'">
          
<xsl:call-template name="autoMakeHead" />
        
</xsl:when>
        
<xsl:when test="$display='plain'">
          
<xsl:apply-templates mode="plain" select="tei:head" />
          
<!--xsl:for-each select="tei:head">
            <xsl:apply-templates mode="plain"/>
          </xsl:for-each
-->
        
</xsl:when>
        
<xsl:when test="$display='simple'">
          
<xsl:apply-templates mode="plain" select="tei:head" />
          
<!--xsl:for-each select="tei:head">
            <xsl:apply-templates mode="plain"/>
          </xsl:for-each
-->
        
</xsl:when>
        
<xsl:otherwise>
          
<xsl:for-each select="tei:head">
            
<xsl:apply-templates />
            
<lb />
          
</xsl:for-each>
        
</xsl:otherwise>
      
</xsl:choose>
    
</xsl:if>
  
</xsl:template>

  
  <xd:doc>
    
<xd:short>[common] processing the number portion of a heading</xd:short>
    
<xd:param name="text" />
    
<xd:detail>By default, the text is printed as is. You may
    wish to colour it, align it, etc
</xd:detail>
  
</xd:doc>

  
<xsl:template name="formatHeadingNumber">
      
<xsl:param name="text" />
      
<xsl:param name="toc" />
      
<xsl:copy-of select="$text" />
  
</xsl:template>

  
  <xd:doc>
    
<xd:short>[common] Making a heading for something, and making sure it has
      contents
</xd:short>
    
<xd:param name="minimal">false</xd:param>
    
<xd:detail>This is a wrapper around the "header" template which ensures that
      some text is returned; if all else fails, the element name is
    used.
</xd:detail>
  
</xd:doc>

  
<xsl:template name="headerLink">
    
<xsl:param name="minimal">false</xsl:param>
    
<xsl:variable name="Text">
      
<xsl:call-template name="header">
        
<xsl:with-param name="minimal" select="$minimalCrossRef" />
        
<xsl:with-param name="display">plain</xsl:with-param>
      
</xsl:call-template>
    
</xsl:variable>
    
<xsl:choose>
      
<xsl:when test="$Text=''">
        
<xsl:text>&lt;</xsl:text>
        
<xsl:value-of select="local-name(.)" />
        
<xsl:text>&gt;</xsl:text>
      
</xsl:when>
      
<xsl:otherwise>
        
<xsl:copy-of select="$Text" />
      
</xsl:otherwise>
    
</xsl:choose>
  
</xsl:template>
  
  <xd:doc>
    
<xd:short>[common] Make a hypertext link</xd:short>
    
<xd:param name="ptr">ptr</xd:param>
    
<xd:detail>
      
<p> cross-referencing </p>
    
</xd:detail>
  
</xd:doc>

  
<xsl:template name="makeTEILink">
    
<xsl:param name="ptr" />
    
<!-- is this a ptr or a ref? -->
    
<xsl:choose>
      
<!-- If there is a target attribute starting with #, it is always a local reference -->
      
<xsl:when test="@target and starts-with(@target,'#')">
        
<xsl:call-template name="makeInternalLink">
          
<xsl:with-param name="target" select="substring-after(@target,'#')" />
          
<xsl:with-param name="ptr" select="$ptr" />
          
<xsl:with-param name="dest">
            
<xsl:call-template name="generateEndLink">
              
<xsl:with-param name="where">
                
<xsl:value-of select="substring-after(@target,'#')" />
              
</xsl:with-param>
            
</xsl:call-template>
          
</xsl:with-param>
        
</xsl:call-template>
      
</xsl:when>
      
<!-- if we are doing TEI P4, all targets are local -->
      
<xsl:when test="@target and $teiP4Compat='true'">
        
<xsl:call-template name="makeInternalLink">
          
<xsl:with-param name="target" select="@target" />
          
<xsl:with-param name="ptr" select="$ptr" />
          
<xsl:with-param name="dest">
            
<xsl:call-template name="generateEndLink">
              
<xsl:with-param name="where">
                
<xsl:value-of select="@target" />
              
</xsl:with-param>
            
</xsl:call-template>
          
</xsl:with-param>
        
</xsl:call-template>
      
</xsl:when>
      
<!-- other uses of target means it is external -->
      
<xsl:when test="@target">
        
<xsl:call-template name="makeExternalLink">
          
<xsl:with-param name="ptr" select="$ptr" />
          
<xsl:with-param name="dest">
            
<xsl:value-of select="@target" />
          
</xsl:with-param>
        
</xsl:call-template>
      
</xsl:when>
      
<!-- If there is a url attribute starting with #, it is a local
       reference 
-->
      
<xsl:when test="@url and starts-with(@url,'#')">
        
<xsl:call-template name="makeInternalLink">
          
<xsl:with-param name="target" select="substring-after(@url,'#')" />
          
<xsl:with-param name="ptr" select="$ptr" />
          
<xsl:with-param name="dest">
            
<xsl:call-template name="generateEndLink">
              
<xsl:with-param name="where">
                
<xsl:value-of select="substring-after(@url,'#')" />
              
</xsl:with-param>
            
</xsl:call-template>
          
</xsl:with-param>
        
</xsl:call-template>
      
</xsl:when>
      
<!-- otherwise it is an external URL -->
      
<xsl:when test="@url">
        
<xsl:call-template name="makeExternalLink">
          
<xsl:with-param name="ptr" select="$ptr" />
          
<xsl:with-param name="dest">
            
<xsl:value-of select="@url" />
          
</xsl:with-param>
        
</xsl:call-template>
      
</xsl:when>
      
<!-- A doc attribute means an external reference -->
      
<xsl:when test="@doc">
        
<xsl:call-template name="makeExternalLink">
          
<xsl:with-param name="ptr" select="$ptr" />
          
<xsl:with-param name="dest">
            
<xsl:value-of select="unparsed-entity-uri(@doc)" />
          
</xsl:with-param>
        
</xsl:call-template>
      
</xsl:when>
      
<xsl:otherwise>
        
<!--
      <xsl:for-each select="@*">
        [[markup error: <xsl:value-of select="name(.)"/>=<xsl:value-of select="."/>]]
      </xsl:for-each>
-->
        
<xsl:apply-templates />
      
</xsl:otherwise>
    
</xsl:choose>
  
</xsl:template>
</xsl:stylesheet>






































v