home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / xml / gnome / xslt / xsldoc / xsldoc.xsl
Encoding:
Extensible Markup Language  |  2006-08-07  |  20.8 KB  |  659 lines

  1. <?xml version='1.0' encoding='UTF-8'?><!-- -*- indent-tabs-mode: nil -*- -->
  2. <!--
  3. This program is free software; you can redistribute it and/or modify it under
  4. the terms of the GNU Lesser General Public License as published by the Free
  5. Software Foundation; either version 2 of the License, or (at your option) any
  6. later version.
  7.  
  8. This program is distributed in the hope that it will be useful, but WITHOUT
  9. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  10. FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  11. details.
  12.  
  13. You should have received a copy of the GNU Lesser General Public License
  14. along with this program; see the file COPYING.LGPL.  If not, write to the
  15. Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  16. 02111-1307, USA.
  17. -->
  18.  
  19. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  20.                 xmlns:doc="http://www.gnome.org/~shaunm/xsldoc"
  21.                 exclude-result-prefixes="doc"
  22.                 version="1.0">
  23.  
  24. <xsl:output method="xml" encoding="utf-8" indent="yes"/>
  25.  
  26. <doc:title>Documenting XSLT Stylesheets</doc:title>
  27.  
  28.  
  29. <!-- == xsldoc.id ========================================================== -->
  30.  
  31. <parameter xmlns="http://www.gnome.org/~shaunm/xsldoc">
  32.   <name>xsldoc.id</name>
  33.   <purpose>
  34.     The id of the top-level element in the output
  35.   </purpose>
  36. </parameter>
  37.  
  38. <xsl:param name="xsldoc.id"/>
  39.  
  40.  
  41. <!-- == xsldoc.toplevel_element ============================================ -->
  42.  
  43. <parameter xmlns="http://www.gnome.org/~shaunm/xsldoc">
  44.   <name>xsldoc.toplevel_element</name>
  45.   <purpose>
  46.     The top-level element in the generated DocBook
  47.   </purpose>
  48.   <para>
  49.     The <parameter>xsldoc.toplevel_element</parameter> parameter defines
  50.     the top-level element used in the generated DocBook.  Allowed values are
  51.     <literal>'article'</literal>, <literal>'appendix'</literal>,
  52.     <literal>'chapter'</literal>, and
  53.     <literal>'section'</literal>.  The default is
  54.     <literal>'section'</literal>.  This may also be set by the
  55.     <xmltag role="xmlpi">xsldoc.toplevel_element</xmltag>
  56.     processing instruction in the source RELAX-NG file.
  57.   </para>
  58. </parameter>
  59.  
  60. <xsl:param name="xsldoc.toplevel_element">
  61.   <xsl:choose>
  62.     <xsl:when test="processing-instruction('xsldoc.toplevel_element')">
  63.       <xsl:value-of select="processing-instruction('xsldoc.toplevel_element')"/>
  64.     </xsl:when>
  65.     <xsl:otherwise>
  66.       <xsl:value-of select="'section'"/>
  67.     </xsl:otherwise>
  68.   </xsl:choose>
  69. </xsl:param>
  70.  
  71.  
  72. <!-- == xsldoc.checks ====================================================== -->
  73.  
  74. <template xmlns="http://www.gnome.org/~shaunm/xsldoc">
  75.   <name>xsldoc.checks</name>
  76.   <purpose>
  77.     Perform some checks on the source file
  78.   </purpose>
  79. </template>
  80.  
  81. <xsl:template name="xsldoc.checks">
  82.   <xsl:variable name="stylesheet" select="."/>
  83.  
  84.   <!-- Check for orphaned doc:parameter -->
  85.   <xsl:for-each select="doc:parameter">
  86.     <xsl:if test="not(following-sibling::*[1]/
  87.                         self::xsl:param[@name = current()/doc:name])">
  88.       <xsl:message>
  89.         <xsl:value-of select="$xsldoc.id"/>
  90.         <xsl:text>: Orphaned doc:parameter </xsl:text>
  91.         <xsl:value-of select="doc:name"/>
  92.       </xsl:message>
  93.     </xsl:if>
  94.   </xsl:for-each>
  95.  
  96.   <!-- Check for undocumented xsl:param -->
  97.   <xsl:for-each select="xsl:param[not(@doc:private = 'true')]">
  98.     <xsl:if test="not(preceding-sibling::*[1]/
  99.                         self::doc:parameter[doc:name = current()/@name])">
  100.       <xsl:message>
  101.         <xsl:value-of select="$xsldoc.id"/>
  102.         <xsl:text>: Undocumented xsl:param </xsl:text>
  103.         <xsl:value-of select="@name"/>
  104.       </xsl:message>
  105.     </xsl:if>
  106.   </xsl:for-each>
  107.  
  108.   <!-- Check for orphaned doc:template -->
  109.   <xsl:for-each select="doc:template">
  110.     <xsl:if test="not(following-sibling::*[1]/
  111.                         self::xsl:template[@name = current()/doc:name])">
  112.       <xsl:message>
  113.         <xsl:value-of select="$xsldoc.id"/>
  114.         <xsl:text>: Orphaned doc:template </xsl:text>
  115.         <xsl:value-of select="doc:name"/>
  116.       </xsl:message>
  117.     </xsl:if>
  118.   </xsl:for-each>
  119.  
  120.   <!-- Check for undocumented xsl:template[@name] -->
  121.   <xsl:for-each select="xsl:template[@name][not(@doc:private = 'true')]">
  122.     <xsl:if test="not(preceding-sibling::*[1]/
  123.                         self::doc:template[doc:name = current()/@name])">
  124.       <xsl:message>
  125.         <xsl:value-of select="$xsldoc.id"/>
  126.         <xsl:text>: Undocumented xsl:template </xsl:text>
  127.         <xsl:value-of select="@name"/>
  128.       </xsl:message>
  129.     </xsl:if>
  130.   </xsl:for-each>
  131.  
  132.   <!-- Check for orphaned doc:mode -->
  133.   <xsl:for-each select="doc:mode">
  134.     <xsl:if test="not($stylesheet/xsl:template[@mode = current()/doc:name])">
  135.       <xsl:if test="not($stylesheet/xsl:template//
  136.                           xsl:call-template[@mode = current()/doc:name])">
  137.         <xsl:message>
  138.           <xsl:value-of select="$xsldoc.id"/>
  139.           <xsl:text>: Orphaned doc:mode </xsl:text>
  140.           <xsl:value-of select="doc:name"/>
  141.         </xsl:message>
  142.       </xsl:if>
  143.     </xsl:if>
  144.   </xsl:for-each>
  145.  
  146.   <!-- Check for undocumented xsl:template/@mode -->
  147.   <xsl:for-each select="xsl:template[@mode]">
  148.     <xsl:if test="not(preceding-sibling::xsl:template[@mode = current()/@mode])">
  149.       <xsl:if test="not(preceding-sibling::doc:mode[doc:name = current()/@mode])">
  150.         <xsl:message>
  151.           <xsl:value-of select="$xsldoc.id"/>
  152.           <xsl:text>: Undocumented xsl:template/@mode </xsl:text>
  153.           <xsl:value-of select="@mode"/>
  154.         </xsl:message>
  155.       </xsl:if>
  156.     </xsl:if>
  157.   </xsl:for-each>
  158.  
  159.   <!-- Check for undocumented xsl:call-template/@mode -->
  160.   <xsl:for-each select="xsl:template//xsl:call-template[@mode]">
  161.     <xsl:if test="not($stylesheet/doc:mode[doc:name = current()/@mode])">
  162.       <xsl:message>
  163.         <xsl:value-of select="$xsldoc.id"/>
  164.         <xsl:text>: Undocumented xsl:call-template/@mode </xsl:text>
  165.         <xsl:value-of select="@mode"/>
  166.       </xsl:message>
  167.     </xsl:if>
  168.   </xsl:for-each>
  169. </xsl:template>
  170.  
  171.  
  172. <!-- == xsldoc.summary ===================================================== -->
  173.  
  174. <template xmlns="http://www.gnome.org/~shaunm/xsldoc">
  175.   <name>xsldoc.summary</name>
  176.   <purpose>
  177.     Generate the Synopsis section
  178.   </purpose>
  179. </template>
  180.  
  181. <xsl:template name="xsldoc.summary">
  182.   <xsl:variable name="parameterQ">
  183.     <xsl:choose>
  184.       <xsl:when test="doc:parameter">
  185.         <xsl:text>1</xsl:text>
  186.       </xsl:when>
  187.       <xsl:when test="xsl:include[@doc:summary = 'true']">
  188.         <xsl:for-each select="xsl:include[@doc:summary = 'true']">
  189.           <xsl:if test="document(@href)/xsl:stylesheet/doc:parameter">
  190.             <xsl:text>1</xsl:text>
  191.           </xsl:if>
  192.         </xsl:for-each>
  193.       </xsl:when>
  194.     </xsl:choose>
  195.   </xsl:variable>
  196.   <xsl:variable name="templateQ">
  197.     <xsl:choose>
  198.       <xsl:when test="doc:template">
  199.         <xsl:text>1</xsl:text>
  200.       </xsl:when>
  201.       <xsl:when test="xsl:include[@doc:summary = 'true']">
  202.         <xsl:for-each select="xsl:include[@doc:summary = 'true']">
  203.           <xsl:if test="document(@href)/xsl:stylesheet/doc:template">
  204.             <xsl:text>1</xsl:text>
  205.           </xsl:if>
  206.         </xsl:for-each>
  207.       </xsl:when>
  208.     </xsl:choose>
  209.   </xsl:variable>
  210.   <xsl:variable name="modeQ">
  211.     <xsl:choose>
  212.       <xsl:when test="doc:mode">
  213.         <xsl:text>1</xsl:text>
  214.       </xsl:when>
  215.       <xsl:when test="xsl:include[@doc:summary = 'true']">
  216.         <xsl:for-each select="xsl:include[@doc:summary = 'true']">
  217.           <xsl:if test="document(@href)/xsl:stylesheet/doc:mode">
  218.             <xsl:text>1</xsl:text>
  219.           </xsl:if>
  220.         </xsl:for-each>
  221.       </xsl:when>
  222.     </xsl:choose>
  223.   </xsl:variable>
  224.   <xsl:if test="$parameterQ != ''">
  225.     <variablelist>
  226.       <title>Parameters</title>
  227.       <xsl:apply-templates mode="xsldoc.summary.mode" select="doc:parameter"/>
  228.       <xsl:for-each select="xsl:include[@doc:summary = 'true']">
  229.         <xsl:apply-templates mode="xsldoc.summary.mode"
  230.                              select="document(@href)/xsl:stylesheet/doc:parameter"/>
  231.       </xsl:for-each>
  232.     </variablelist>
  233.   </xsl:if>
  234.   <xsl:if test="$templateQ != ''">
  235.     <variablelist>
  236.       <title>Templates</title>
  237.       <xsl:apply-templates mode="xsldoc.summary.mode" select="doc:template"/>
  238.       <xsl:for-each select="xsl:include[@doc:summary = 'true']">
  239.         <xsl:apply-templates mode="xsldoc.summary.mode"
  240.                              select="document(@href)/xsl:stylesheet/doc:template"/>
  241.       </xsl:for-each>
  242.     </variablelist>
  243.   </xsl:if>
  244.   <xsl:if test="$modeQ != ''">
  245.     <variablelist>
  246.       <title>Modes</title>
  247.       <xsl:apply-templates mode="xsldoc.summary.mode" select="doc:mode"/>
  248.       <xsl:for-each select="xsl:include[@doc:summary = 'true']">
  249.         <xsl:apply-templates mode="xsldoc.summary.mode"
  250.                              select="document(@href)/xsl:stylesheet/doc:mode"/>
  251.       </xsl:for-each>
  252.     </variablelist>
  253.   </xsl:if>
  254.   <xsl:if test="$parameterQ = '' and $templateQ = '' and $modeQ = ''">
  255.     <para>FIXME: Nothing to see here</para>
  256.   </xsl:if>
  257.   <xsl:apply-templates mode="xsldoc.refentry.mode" select="doc:parameter"/>
  258.   <xsl:apply-templates mode="xsldoc.refentry.mode" select="doc:template"/>
  259.   <xsl:apply-templates mode="xsldoc.refentry.mode" select="doc:mode"/>
  260. </xsl:template>
  261.  
  262.  
  263. <!-- == xsldoc.refentry.mode =============================================== -->
  264.  
  265. <mode xmlns="http://www.gnome.org/~shaunm/xsldoc">
  266.   <name>xsldoc.refentry.mode</name>
  267. </mode>
  268.  
  269. <!-- = doc:mode = -->
  270. <xsl:template mode="xsldoc.refentry.mode" match="doc:mode">
  271.   <refentry id="mode_{doc:name}">
  272.     <indexterm>
  273.       <primary> 
  274.         <xsl:value-of select="doc:name"/>
  275.       </primary>
  276.     </indexterm>
  277.     <refnamediv>
  278.       <refname>
  279.         <xsl:value-of select="doc:name"/>
  280.       </refname>
  281.       <refpurpose>
  282.         <xsl:apply-templates select="doc:purpose"/>
  283.       </refpurpose>
  284.     </refnamediv>
  285.     <refsection>
  286.       <title>Description</title>
  287.       <xsl:if test="not(doc:description/node())">
  288.         <para>This mode has no description</para>
  289.       </xsl:if>
  290.       <xsl:apply-templates mode="xsldoc.docbook.mode"
  291.                            select="doc:description/node()"/>
  292.     </refsection>
  293.     <xsl:for-each select="doc:section">
  294.       <refsection>
  295.         <xsl:apply-templates mode="xsldoc.docbook.mode" select="*"/>
  296.       </refsection>
  297.     </xsl:for-each>
  298.   </refentry>
  299. </xsl:template>
  300.  
  301. <!-- = doc:parameter = -->
  302. <xsl:template mode="xsldoc.refentry.mode" match="doc:parameter">
  303.   <refentry id="param_{doc:name}">
  304.     <indexterm>
  305.       <primary> 
  306.         <xsl:value-of select="doc:name"/>
  307.       </primary>
  308.     </indexterm>
  309.     <refnamediv>
  310.       <refname>
  311.         <xsl:apply-templates mode="xsldoc.docbook.mode"
  312.                              select="doc:name/node()"/>
  313.       </refname>
  314.       <refpurpose>
  315.         <xsl:apply-templates mode="xsldoc.docbook.mode"
  316.                              select="doc:purpose/node()"/>
  317.       </refpurpose>
  318.     </refnamediv>
  319.     <refsection>
  320.       <title>Description</title>
  321.       <xsl:if test="not(doc:description/node())">
  322.         <para>This parameter has no description</para>
  323.       </xsl:if>
  324.       <xsl:apply-templates mode="xsldoc.docbook.mode"
  325.                            select="doc:description/node()"/>
  326.     </refsection>
  327.     <xsl:for-each select="doc:section">
  328.       <refsection>
  329.         <xsl:apply-templates mode="xsldoc.docbook.mode" select="*"/>
  330.       </refsection>
  331.     </xsl:for-each>
  332.   </refentry>
  333. </xsl:template>
  334.  
  335. <!-- = doc:template = -->
  336. <xsl:template mode="xsldoc.refentry.mode" match="doc:template">
  337.   <refentry id="template_{doc:name}">
  338.     <indexterm>
  339.       <primary> 
  340.         <xsl:value-of select="doc:name"/>
  341.       </primary>
  342.     </indexterm>
  343.     <refnamediv>
  344.       <refname>
  345.         <xsl:apply-templates mode="xsldoc.docbook.mode"
  346.                              select="doc:name/node()"/>
  347.       </refname>
  348.       <refpurpose>
  349.         <xsl:apply-templates mode="xsldoc.docbook.mode"
  350.                              select="doc:purpose/node()"/>
  351.       </refpurpose>
  352.     </refnamediv>
  353.     <refsection>
  354.       <title>Parameters</title>
  355.       <xsl:choose>
  356.         <xsl:when test="doc:parameter">
  357.           <variablelist>
  358.             <xsl:for-each select="doc:parameter">
  359.               <varlistentry>
  360.                 <term>
  361.                   <parameter>
  362.                     <xsl:apply-templates mode="xsldoc.docbook.mode"
  363.                                          select="doc:name/node()"/>
  364.                   </parameter>
  365.                 </term>
  366.                 <listitem>
  367.                   <para>
  368.                     <xsl:apply-templates mode="xsldoc.docbook.mode"
  369.                                          select="doc:purpose/node()"/>
  370.                   </para>
  371.                   <xsl:apply-templates mode="xsldoc.docbook.mode"
  372.                                        select="doc:description/node()"/>
  373.                 </listitem>
  374.               </varlistentry>
  375.             </xsl:for-each>
  376.           </variablelist>
  377.         </xsl:when>
  378.         <xsl:otherwise>
  379.           <para>This template has no parameters.</para>
  380.         </xsl:otherwise>
  381.       </xsl:choose>
  382.     </refsection>
  383.     <xsl:if test="doc:description">
  384.       <refsection>
  385.         <title>Description</title>
  386.         <xsl:apply-templates mode="xsldoc.docbook.mode"
  387.                              select="doc:description/node()"/>
  388.       </refsection>
  389.     </xsl:if>
  390.     <xsl:for-each select="doc:section">
  391.       <refsection>
  392.         <xsl:apply-templates mode="xsldoc.docbook.mode" select="*"/>
  393.       </refsection>
  394.     </xsl:for-each>
  395.   </refentry>
  396. </xsl:template>
  397.  
  398.  
  399. <!-- == xsldoc.summary.mode ================================================ -->
  400.  
  401. <mode xmlns="http://www.gnome.org/~shaunm/xsldoc">
  402.   <name>xsldoc.summary.mode</name>
  403. </mode>
  404.  
  405. <!-- = doc:mode = -->
  406. <xsl:template mode="xsldoc.summary.mode" match="doc:mode">
  407.   <varlistentry>
  408.     <term>
  409.       <link linkend="mode_{doc:name}">
  410.         <function role="mode">
  411.           <xsl:apply-templates mode="xsldoc.docbook.mode"
  412.                                select="doc:name/node()"/>
  413.         </function>
  414.       </link>
  415.     </term>
  416.     <listitem>
  417.       <para>
  418.         <xsl:apply-templates mode="xsldoc.docbook.mode"
  419.                              select="doc:purpose"/>
  420.       </para>
  421.     </listitem>
  422.   </varlistentry>
  423. </xsl:template>
  424.  
  425. <!-- = doc:parameter = -->
  426. <xsl:template mode="xsldoc.summary.mode" match="doc:parameter">
  427.   <varlistentry>
  428.     <term>
  429.       <link linkend="param_{doc:name}">
  430.         <parameter>
  431.           <xsl:value-of select="doc:name"/>
  432.         </parameter>
  433.       </link>
  434.     </term>
  435.     <listitem>
  436.       <para>
  437.         <xsl:apply-templates select="doc:purpose"/>
  438.       </para>
  439.     </listitem>
  440.   </varlistentry>
  441. </xsl:template>
  442.  
  443. <!-- = doc:template = -->
  444. <xsl:template mode="xsldoc.summary.mode" match="doc:template">
  445.   <varlistentry>
  446.     <term>
  447.       <link linkend="template_{doc:name}">
  448.         <function role="template">
  449.           <xsl:value-of select="doc:name"/>
  450.         </function>
  451.       </link>
  452.     </term>
  453.     <listitem>
  454.       <para>
  455.         <xsl:apply-templates select="doc:purpose"/>
  456.       </para>
  457.     </listitem>
  458.   </varlistentry>
  459. </xsl:template>
  460.  
  461.  
  462. <!-- == xsldoc.docbook.mode ================================================ -->
  463.  
  464. <mode xmlns="http://www.gnome.org/~shaunm/xsldoc">
  465.   <name>xsldoc.docbook.mode</name>
  466. </mode>
  467.  
  468. <xsl:template mode="xsldoc.docbook.mode" match="doc:xmltag">
  469.   <xsl:element name="sgmltag">
  470.     <xsl:for-each select="attribute::*">
  471.       <xsl:copy/>
  472.     </xsl:for-each>
  473.     <xsl:for-each select="* | text()">
  474.       <xsl:apply-templates mode="xsldoc.docbook.mode" select="."/>
  475.     </xsl:for-each>
  476.   </xsl:element>
  477. </xsl:template>
  478.  
  479. <xsl:template mode="xsldoc.docbook.mode" match="doc:*">
  480.   <xsl:element name="{local-name(.)}">
  481.     <xsl:for-each select="attribute::*">
  482.       <xsl:copy/>
  483.     </xsl:for-each>
  484.     <xsl:for-each select="* | text()">
  485.       <xsl:apply-templates mode="xsldoc.docbook.mode" select="."/>
  486.     </xsl:for-each>
  487.   </xsl:element>
  488. </xsl:template>
  489.  
  490. <xsl:template mode="xsldoc.docbook.mode" match="*">
  491.   <xsl:copy>
  492.     <xsl:for-each select="node()">
  493.       <xsl:apply-templates mode="xsldoc.docbook.mode" select="."/>
  494.     </xsl:for-each>
  495.   </xsl:copy>
  496. </xsl:template>
  497.  
  498.  
  499. <!-- == xsldoc.params ====================================================== -->
  500.  
  501. <template xmlns="http://www.gnome.org/~shaunm/xsldoc">
  502.   <name>xsldoc.params</name>
  503.   <purpose>
  504.     Generate the Parameters section
  505.   </purpose>
  506. </template>
  507.  
  508. <xsl:template name="xsldoc.params">
  509.   <xsl:variable name="params"
  510.                 select="ref:refname[following-sibling::xsl:*[1]/self::xsl:param]"/>
  511.   <xsl:if test="$params">
  512.     <section>
  513.       <xsl:attribute name="id">
  514.         <xsl:value-of select="concat($xsldoc.id, '-params')"/>
  515.       </xsl:attribute>
  516.       <title>Stylesheet Parameters</title>
  517.       <xsl:for-each select="$params">
  518.         <refentry>
  519.           <refnamediv>
  520.             <refname>
  521.               <xsl:apply-templates/>
  522.             </refname>
  523.             <xsl:if test="following-sibling::ref:*[1]/self::ref:refpurpose">
  524.               <refpurpose>
  525.                 <xsl:apply-templates select="following-sibling::ref:*[1]"/>
  526.               </refpurpose>
  527.             </xsl:if>
  528.           </refnamediv>
  529.         </refentry>
  530.       </xsl:for-each>
  531.     </section>
  532.   </xsl:if>
  533. </xsl:template>
  534.  
  535.  
  536. <!-- == xsldoc.named ======================================================= -->
  537.  
  538. <template xmlns="http://www.gnome.org/~shaunm/xsldoc">
  539.   <name>xsldoc.named</name>
  540.   <purpose>
  541.     Generate the Named Templates section
  542.   </purpose>
  543. </template>
  544.  
  545. <xsl:template name="xsldoc.named">
  546.   <xsl:variable name="named"
  547.                 select="ref:refname
  548.                           [following-sibling::xsl:*[1]
  549.                             /self::xsl:template[@name]]"/>
  550.   <xsl:if test="$named">
  551.     <section>
  552.       <xsl:attribute name="id">
  553.         <xsl:value-of select="concat($xsldoc.id, '-named')"/>
  554.       </xsl:attribute>
  555.       <title>Named Templates</title>
  556.       <xsl:for-each select="$named">
  557.         <refentry>
  558.           <refnamediv>
  559.             <refname>
  560.               <xsl:apply-templates/>
  561.             </refname>
  562.             <xsl:if test="following-sibling::ref:*[1]/self::ref:refpurpose">
  563.               <refpurpose>
  564.                 <xsl:apply-templates select="following-sibling::ref:*[1]"/>
  565.               </refpurpose>
  566.             </xsl:if>
  567.           </refnamediv>
  568.         </refentry>
  569.       </xsl:for-each>
  570.     </section>
  571.   </xsl:if>
  572. </xsl:template>
  573.  
  574.  
  575. <!-- == xsldoc.includes ==================================================== -->
  576.  
  577. <template xmlns="http://www.gnome.org/~shaunm/xsldoc">
  578.   <name>xsldoc.includes</name>
  579.   <purpose>
  580.     Include external files
  581.   </purpose>
  582. </template>
  583.  
  584. <xsl:template name="xsldoc.includes">
  585.   <xsl:for-each select="xsl:include[@doc:include='true']">
  586.     <include xmlns="http://www.w3.org/2001/XInclude">
  587.       <xsl:attribute name="href">
  588.         <xsl:call-template name="_hrefify"/>
  589.       </xsl:attribute>
  590.     </include>
  591.   </xsl:for-each>
  592. </xsl:template>
  593.  
  594. <xsl:template name="_hrefify" doc:private="true">
  595.   <xsl:param name="href" select="@href"/>
  596.   <xsl:choose>
  597.     <xsl:when test="contains($href, '/')">
  598.       <xsl:call-template name="_hrefify">
  599.         <xsl:with-param name="href" select="substring-after($href, '/')"/>
  600.       </xsl:call-template>
  601.     </xsl:when>
  602.     <xsl:when test="substring($href, string-length($href) - 3, 4) = '.xsl'">
  603.       <xsl:value-of select="concat(substring($href, 1, string-length($href) - 3),
  604.                                    'xml')"/>
  605.     </xsl:when>
  606.     <xsl:otherwise>
  607.       <xsl:value-of select="$href"/>
  608.     </xsl:otherwise>
  609.   </xsl:choose>
  610. </xsl:template>
  611.  
  612.  
  613. <!-- == Matched Templates ================================================== -->
  614.  
  615. <!-- = /xsl:stylesheet = -->
  616. <xsl:template match="/xsl:stylesheet">
  617.   <xsl:variable name="toplevel_element">
  618.     <xsl:choose>
  619.       <xsl:when test="
  620.                 $xsldoc.toplevel_element = 'article'   or
  621.                 $xsldoc.toplevel_element = 'appendix'  or
  622.                 $xsldoc.toplevel_element = 'chapter'   or
  623.                 $xsldoc.toplevel_element = 'section'   ">
  624.         <xsl:value-of select="$xsldoc.toplevel_element"/>
  625.       </xsl:when>
  626.       <xsl:otherwise>
  627.         <xsl:message terminate="yes">
  628.           <xsl:text>Unsupported value of $xsldoc.toplevel_element: </xsl:text>
  629.           <xsl:value-of select="$xsldoc.toplevel_element"/>
  630.         </xsl:message>
  631.       </xsl:otherwise>
  632.     </xsl:choose>
  633.   </xsl:variable>
  634.   <xsl:element name="{$toplevel_element}" namespace="">
  635.     <xsl:attribute name="id">
  636.       <xsl:value-of select="concat($toplevel_element, '-', $xsldoc.id)"/>
  637.     </xsl:attribute>
  638.     <title>
  639.       <xsl:apply-templates mode="xsldoc.docbook.mode"
  640.                            select="doc:title[1]/node()"/>
  641.     </title>
  642.     <xsl:call-template name="xsldoc.checks"/>
  643.     <xsl:call-template name="xsldoc.summary"/>
  644.     <xsl:call-template name="xsldoc.includes"/>
  645.     <!--
  646.       <xsl:call-template name="xsldoc.params"/>
  647.       <xsl:call-template name="xsldoc.named"/>
  648.       <section>
  649.       <xsl:attribute name="id">
  650.       <xsl:value-of select="concat($xsldoc.id, '-matched')"/>
  651.       </xsl:attribute>
  652.       <title>Matched Templates</title>
  653.       </section>
  654.     -->
  655.   </xsl:element>
  656. </xsl:template>
  657.  
  658. </xsl:stylesheet>
  659.