]> granicus.if.org Git - docbook-dsssl/commitdiff
Added mechanism for dynamically generating docbook-elements.xsl
authorMichael Smith <xmldoc@users.sourceforge.net>
Wed, 5 Apr 2006 05:18:29 +0000 (05:18 +0000)
committerMichael Smith <xmldoc@users.sourceforge.net>
Wed, 5 Apr 2006 05:18:29 +0000 (05:18 +0000)
file (current list of DocBook elements, generated from current
DocBook 5 .rng file in source repository). So removed static
docbook-elements.xsl file from source control. Also removed
make-xsl-params.pl Perl script and replaced it with
make-elements.xsl, an XSL stylesheet that does the same thing the
Perl script did (dymanically generate a list of DocBook XSL
stylesheet params).

xsl/docsrc/.cvsignore
xsl/docsrc/Makefile
xsl/docsrc/docbook-elements.xsl [deleted file]
xsl/docsrc/make-elements.xsl [new file with mode: 0644]
xsl/docsrc/make-xsl-params.pl [deleted file]
xsl/docsrc/make-xsl-params.xsl [new file with mode: 0644]

index 79cc3a4af90a01d1941436b591aa39e658dfb8f4..5befc41e4b57dd0d0f857d8127b4afcb0b0e0de8 100644 (file)
@@ -1 +1,2 @@
 xsl-params.xsl
+docbook-elements.xsl
index 0fff632f27ffe76f8a1ed97cf0eeb8520626d058..497e4ae6eea90d1780c8c5bd5950ca55462fa085 100644 (file)
@@ -1,6 +1,14 @@
+include ../../cvstools/Makefile.incl
 DIRS=common refentry html fo manpages wordml slides/html website template tools pi
 
-all: xsl-params.xsl
+DOCBOOK5_RNG=../../docbook/relaxng/docbook/docbook.rng
+PARAM_XSL_FILES=$(shell for file in $$(find . -name "param.xsl"); do \
+       readlink -f $$file; done | grep -v xhtml)
+
+MAKE_ELEMENTS_XSL=make-elements.xsl
+MAKE_PARAMS_XSL=make-xsl-params.xsl
+
+all: docbook-elements.xsl xsl-params.xsl
        for i in $(DIRS) __bogus__; do \
                if [ $$i != __bogus__ ] ; then \
                        echo "$(MAKE) -C $$i"; $(MAKE) -C $$i; \
@@ -14,8 +22,15 @@ clean:
                fi \
        done
 
-xsl-params.xsl: make-xsl-params.pl
-       perl $< > $@
+$(DOCBOOK5_RNG):
+       $(MAKE) -C $(dir $@) $(notdir $@)
+
+docbook-elements.xsl: $(MAKE_ELEMENTS_XSL) $(DOCBOOK5_RNG)
+       $(XSLT) $(DOCBOOK5_RNG) $< $@
+
+xsl-params.xsl: $(MAKE_PARAMS_XSL) $(PARAM_XSL_FILES)
+       $(XSLT) $< $< $@
 
 realclean: clean
-       rm -f xsl-params.xsl
+       $(RM) docbook-elements.xsl
+       $(RM) xsl-params.xsl
diff --git a/xsl/docsrc/docbook-elements.xsl b/xsl/docsrc/docbook-elements.xsl
deleted file mode 100644 (file)
index 7dfc3d5..0000000
+++ /dev/null
@@ -1,419 +0,0 @@
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:exsl="http://exslt.org/common"
-                version="1.0">
-
-<xsl:variable name="docbook-element-list">
-  <simplelist>
-    <member>abbrev</member>
-    <member>abstract</member>
-    <member>accel</member>
-    <member>ackno</member>
-    <member>acronym</member>
-    <member>action</member>
-    <member>address</member>
-    <member>affiliation</member>
-    <member>alt</member>
-    <member>anchor</member>
-    <member>answer</member>
-    <member>appendix</member>
-    <member>appendixinfo</member>
-    <member>application</member>
-    <member>area</member>
-    <member>areaset</member>
-    <member>areaspec</member>
-    <member>arg</member>
-    <member>article</member>
-    <member>articleinfo</member>
-    <member>artpagenums</member>
-    <member>attribution</member>
-    <member>audiodata</member>
-    <member>audioobject</member>
-    <member>author</member>
-    <member>authorblurb</member>
-    <member>authorgroup</member>
-    <member>authorinitials</member>
-    <member>beginpage</member>
-    <member>bibliocoverage</member>
-    <member>bibliodiv</member>
-    <member>biblioentry</member>
-    <member>bibliography</member>
-    <member>bibliographyinfo</member>
-    <member>biblioid</member>
-    <member>bibliomisc</member>
-    <member>bibliomixed</member>
-    <member>bibliomset</member>
-    <member>bibliorelation</member>
-    <member>biblioset</member>
-    <member>bibliosource</member>
-    <member>blockinfo</member>
-    <member>blockquote</member>
-    <member>book</member>
-    <member>bookinfo</member>
-    <member>bridgehead</member>
-    <member>callout</member>
-    <member>calloutlist</member>
-    <member>caption</member>
-    <member>caution</member>
-    <member>chapter</member>
-    <member>chapterinfo</member>
-    <member>citation</member>
-    <member>citebiblioid</member>
-    <member>citerefentry</member>
-    <member>citetitle</member>
-    <member>city</member>
-    <member>classname</member>
-    <member>classsynopsis</member>
-    <member>classsynopsisinfo</member>
-    <member>cmdsynopsis</member>
-    <member>co</member>
-    <member>collab</member>
-    <member>collabname</member>
-    <member>colophon</member>
-    <member>colspec</member>
-    <member>command</member>
-    <member>computeroutput</member>
-    <member>confdates</member>
-    <member>confgroup</member>
-    <member>confnum</member>
-    <member>confsponsor</member>
-    <member>conftitle</member>
-    <member>constant</member>
-    <member>constraint</member>
-    <member>constraintdef</member>
-    <member>constructorsynopsis</member>
-    <member>contractnum</member>
-    <member>contractsponsor</member>
-    <member>contrib</member>
-    <member>copyright</member>
-    <member>coref</member>
-    <member>corpauthor</member>
-    <member>corpname</member>
-    <member>country</member>
-    <member>database</member>
-    <member>date</member>
-    <member>dedication</member>
-    <member>destructorsynopsis</member>
-    <member>edition</member>
-    <member>editor</member>
-    <member>email</member>
-    <member>emphasis</member>
-    <member>entry</member>
-    <member>entrytbl</member>
-    <member>envar</member>
-    <member>epigraph</member>
-    <member>equation</member>
-    <member>errorcode</member>
-    <member>errorname</member>
-    <member>errortext</member>
-    <member>errortype</member>
-    <member>example</member>
-    <member>exceptionname</member>
-    <member>fax</member>
-    <member>fieldsynopsis</member>
-    <member>figure</member>
-    <member>filename</member>
-    <member>firstname</member>
-    <member>firstterm</member>
-    <member>footnote</member>
-    <member>footnoteref</member>
-    <member>foreignphrase</member>
-    <member>formalpara</member>
-    <member>funcdef</member>
-    <member>funcparams</member>
-    <member>funcprototype</member>
-    <member>funcsynopsis</member>
-    <member>funcsynopsisinfo</member>
-    <member>function</member>
-    <member>glossary</member>
-    <member>glossaryinfo</member>
-    <member>glossdef</member>
-    <member>glossdiv</member>
-    <member>glossentry</member>
-    <member>glosslist</member>
-    <member>glosssee</member>
-    <member>glossseealso</member>
-    <member>glossterm</member>
-    <member>graphic</member>
-    <member>graphicco</member>
-    <member>group</member>
-    <member>guibutton</member>
-    <member>guiicon</member>
-    <member>guilabel</member>
-    <member>guimenu</member>
-    <member>guimenuitem</member>
-    <member>guisubmenu</member>
-    <member>hardware</member>
-    <member>highlights</member>
-    <member>holder</member>
-    <member>honorific</member>
-    <member>imagedata</member>
-    <member>imageobject</member>
-    <member>imageobjectco</member>
-    <member>important</member>
-    <member>index</member>
-    <member>indexdiv</member>
-    <member>indexentry</member>
-    <member>indexinfo</member>
-    <member>indexterm</member>
-    <member>informalequation</member>
-    <member>informalexample</member>
-    <member>informalfigure</member>
-    <member>informaltable</member>
-    <member>initializer</member>
-    <member>inlineequation</member>
-    <member>inlinegraphic</member>
-    <member>inlinemediaobject</member>
-    <member>interface</member>
-    <member>interfacename</member>
-    <member>invpartnumber</member>
-    <member>isbn</member>
-    <member>issn</member>
-    <member>issuenum</member>
-    <member>itemizedlist</member>
-    <member>itermset</member>
-    <member>jobtitle</member>
-    <member>keycap</member>
-    <member>keycode</member>
-    <member>keycombo</member>
-    <member>keysym</member>
-    <member>keyword</member>
-    <member>keywordset</member>
-    <member>label</member>
-    <member>legalnotice</member>
-    <member>lhs</member>
-    <member>lineage</member>
-    <member>lineannotation</member>
-    <member>link</member>
-    <member>listitem</member>
-    <member>literal</member>
-    <member>literallayout</member>
-    <member>lot</member>
-    <member>lotentry</member>
-    <member>manvolnum</member>
-    <member>markup</member>
-    <member>medialabel</member>
-    <member>mediaobject</member>
-    <member>mediaobjectco</member>
-    <member>member</member>
-    <member>menuchoice</member>
-    <member>methodname</member>
-    <member>methodparam</member>
-    <member>methodsynopsis</member>
-    <member>modespec</member>
-    <member>modifier</member>
-    <member>mousebutton</member>
-    <member>msg</member>
-    <member>msgaud</member>
-    <member>msgentry</member>
-    <member>msgexplan</member>
-    <member>msginfo</member>
-    <member>msglevel</member>
-    <member>msgmain</member>
-    <member>msgorig</member>
-    <member>msgrel</member>
-    <member>msgset</member>
-    <member>msgsub</member>
-    <member>msgtext</member>
-    <member>nonterminal</member>
-    <member>note</member>
-    <member>objectinfo</member>
-    <member>olink</member>
-    <member>ooclass</member>
-    <member>ooexception</member>
-    <member>oointerface</member>
-    <member>option</member>
-    <member>optional</member>
-    <member>orderedlist</member>
-    <member>orgdiv</member>
-    <member>orgname</member>
-    <member>otheraddr</member>
-    <member>othercredit</member>
-    <member>othername</member>
-    <member>pagenums</member>
-    <member>para</member>
-    <member>paramdef</member>
-    <member>parameter</member>
-    <member>part</member>
-    <member>partinfo</member>
-    <member>partintro</member>
-    <member>personblurb</member>
-    <member>personname</member>
-    <member>phone</member>
-    <member>phrase</member>
-    <member>pob</member>
-    <member>postcode</member>
-    <member>preface</member>
-    <member>prefaceinfo</member>
-    <member>primary</member>
-    <member>primaryie</member>
-    <member>printhistory</member>
-    <member>procedure</member>
-    <member>production</member>
-    <member>productionrecap</member>
-    <member>productionset</member>
-    <member>productname</member>
-    <member>productnumber</member>
-    <member>programlisting</member>
-    <member>programlistingco</member>
-    <member>prompt</member>
-    <member>property</member>
-    <member>pubdate</member>
-    <member>publisher</member>
-    <member>publishername</member>
-    <member>pubsnumber</member>
-    <member>qandadiv</member>
-    <member>qandaentry</member>
-    <member>qandaset</member>
-    <member>question</member>
-    <member>quote</member>
-    <member>refclass</member>
-    <member>refdescriptor</member>
-    <member>refentry</member>
-    <member>refentryinfo</member>
-    <member>refentrytitle</member>
-    <member>reference</member>
-    <member>referenceinfo</member>
-    <member>refmeta</member>
-    <member>refmiscinfo</member>
-    <member>refname</member>
-    <member>refnamediv</member>
-    <member>refpurpose</member>
-    <member>refsect1</member>
-    <member>refsect1info</member>
-    <member>refsect2</member>
-    <member>refsect2info</member>
-    <member>refsect3</member>
-    <member>refsect3info</member>
-    <member>refsection</member>
-    <member>refsectioninfo</member>
-    <member>refsynopsisdiv</member>
-    <member>refsynopsisdivinfo</member>
-    <member>releaseinfo</member>
-    <member>remark</member>
-    <member>replaceable</member>
-    <member>returnvalue</member>
-    <member>revdescription</member>
-    <member>revhistory</member>
-    <member>revision</member>
-    <member>revnumber</member>
-    <member>revremark</member>
-    <member>rhs</member>
-    <member>row</member>
-    <member>sbr</member>
-    <member>screen</member>
-    <member>screenco</member>
-    <member>screeninfo</member>
-    <member>screenshot</member>
-    <member>secondary</member>
-    <member>secondaryie</member>
-    <member>sect1</member>
-    <member>sect1info</member>
-    <member>sect2</member>
-    <member>sect2info</member>
-    <member>sect3</member>
-    <member>sect3info</member>
-    <member>sect4</member>
-    <member>sect4info</member>
-    <member>sect5</member>
-    <member>sect5info</member>
-    <member>section</member>
-    <member>sectioninfo</member>
-    <member>see</member>
-    <member>seealso</member>
-    <member>seealsoie</member>
-    <member>seeie</member>
-    <member>seg</member>
-    <member>seglistitem</member>
-    <member>segmentedlist</member>
-    <member>segtitle</member>
-    <member>seriesvolnums</member>
-    <member>set</member>
-    <member>setindex</member>
-    <member>setindexinfo</member>
-    <member>setinfo</member>
-    <member>sgmltag</member>
-    <member>shortaffil</member>
-    <member>shortcut</member>
-    <member>sidebar</member>
-    <member>sidebarinfo</member>
-    <member>simpara</member>
-    <member>simplelist</member>
-    <member>simplemsgentry</member>
-    <member>simplesect</member>
-    <member>spanspec</member>
-    <member>state</member>
-    <member>step</member>
-    <member>street</member>
-    <member>structfield</member>
-    <member>structname</member>
-    <member>subject</member>
-    <member>subjectset</member>
-    <member>subjectterm</member>
-    <member>subscript</member>
-    <member>substeps</member>
-    <member>subtitle</member>
-    <member>superscript</member>
-    <member>surname</member>
-    <member>symbol</member>
-    <member>synopfragment</member>
-    <member>synopfragmentref</member>
-    <member>synopsis</member>
-    <member>systemitem</member>
-    <member>table</member>
-    <member>tbody</member>
-    <member>term</member>
-    <member>tertiary</member>
-    <member>tertiaryie</member>
-    <member>textdata</member>
-    <member>textobject</member>
-    <member>tfoot</member>
-    <member>tgroup</member>
-    <member>thead</member>
-    <member>tip</member>
-    <member>title</member>
-    <member>titleabbrev</member>
-    <member>toc</member>
-    <member>tocback</member>
-    <member>tocchap</member>
-    <member>tocentry</member>
-    <member>tocfront</member>
-    <member>toclevel1</member>
-    <member>toclevel2</member>
-    <member>toclevel3</member>
-    <member>toclevel4</member>
-    <member>toclevel5</member>
-    <member>tocpart</member>
-    <member>token</member>
-    <member>trademark</member>
-    <member>type</member>
-    <member>ulink</member>
-    <member>userinput</member>
-    <member>varargs</member>
-    <member>variablelist</member>
-    <member>varlistentry</member>
-    <member>varname</member>
-    <member>videodata</member>
-    <member>videoobject</member>
-    <member>void</member>
-    <member>volumenum</member>
-    <member>warning</member>
-    <member>wordasword</member>
-    <member>xref</member>
-    <member>year</member>
-  </simplelist>
-</xsl:variable>
-
-<xsl:variable name="docbook-elements"
-              select="exsl:node-set($docbook-element-list)/simplelist"/>
-
-<xsl:template name="is-docbook-element">
-  <xsl:param name="element" select="''"/>
-
-  <xsl:choose>
-    <xsl:when test="$docbook-elements/member[. = $element]">1</xsl:when>
-    <xsl:otherwise>0</xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/xsl/docsrc/make-elements.xsl b/xsl/docsrc/make-elements.xsl
new file mode 100644 (file)
index 0000000..f15f442
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:exsl="http://exslt.org/common"
+                xmlns:xslt="dummy"
+                version="1.0">
+  <xsl:output indent="yes"/>
+  <xsl:namespace-alias stylesheet-prefix="xslt" result-prefix="xsl"/>
+  <!-- ********************************************************************
+       $Id$
+       ********************************************************************
+
+       This file is part of the XSL DocBook Stylesheet distribution.
+       See ../README or http://docbook.sf.net/release/xsl/current/ for
+       copyright and other information.
+
+       ******************************************************************** -->
+
+  <!-- ==================================================================== -->
+
+  <!-- * This stylesheet expects as input a RELAX NG grammar that -->
+  <!-- * defines a set of (DocBook) elements, From that grammar, it gets -->
+  <!-- * the value of the "name" attribute for each element defined in -->
+  <!-- * that grammar, then generates a list of those names. -->
+
+  <xsl:template match="/">
+    <xslt:stylesheet version="1.0">
+      <xsl:text>&#xa;</xsl:text>
+      <xsl:comment> *           Do not edit this file. </xsl:comment>
+      <xsl:text>&#xa;</xsl:text>
+      <xsl:comment> * It was generated automatically by the build. </xsl:comment>
+      <xsl:text>&#xa;</xsl:text>
+      <xsl:comment> * Edit the make-elements.xsl file instead. </xsl:comment>
+      <xslt:variable name="docbook-element-list">
+        <simplelist role="element"> 
+          <xsl:for-each
+              select="//*[local-name() = 'element'][@name]">
+            <xsl:sort select="@name"/>
+            <xsl:if test="not(@name = preceding::*[local-name() = 'element']/@name)">
+              <member><xsl:value-of select="@name"/></member>
+            </xsl:if>
+          </xsl:for-each>
+        </simplelist>
+      </xslt:variable>
+
+      <xslt:variable name="docbook-elements"
+                    select="exsl:node-set($docbook-element-list)/simplelist"/>
+
+      <xslt:template name="is-docbook-element">
+        <xslt:param name="element" select="''"/>
+
+        <xslt:choose>
+          <xslt:when test="$docbook-elements/member[. = $element]">1</xslt:when>
+          <xslt:otherwise>0</xslt:otherwise>
+        </xslt:choose>
+      </xslt:template>
+    </xslt:stylesheet>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/xsl/docsrc/make-xsl-params.pl b/xsl/docsrc/make-xsl-params.pl
deleted file mode 100755 (executable)
index af3ee74..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/usr/bin/perl -- # -*- Perl -*- 
-
-# Must be run from the "docssrc" directory
-
-print <<EOF1;
-<?xml version="1.0"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:exsl="http://exslt.org/common"
-                version="1.0">
-
-
-<xsl:variable name="xsl-html-parameters-list">
-  <simplelist>
-EOF1
-
-open (F, "../html/param.xsl");
-read (F, $_, -s "../html/param.xsl");
-close (F);
-foreach my $param (/<xsl:param name="[^\"]+"/gs) {
-    $param =~ /name=\"(.*)\"/;
-    print "    <member>$1</member>\n", 
-}
-
-print <<EOF2;
-  </simplelist>
-</xsl:variable>
-
-<xsl:variable name="xsl-fo-parameters-list">
-  <simplelist>
-EOF2
-
-open (F, "../fo/param.xsl");
-read (F, $_, -s "../fo/param.xsl");
-close (F);
-foreach my $param (/<xsl:param name="[^\"]+"/gs) {
-    $param =~ /name=\"(.*)\"/;
-    print "    <member>$1</member>\n", 
-}
-
-print <<EOF3;
-  </simplelist>
-</xsl:variable>
-
-<xsl:variable name="xsl-manpages-parameters-list">
-  <simplelist>
-EOF3
-
-open (F, "../manpages/param.xsl");
-read (F, $_, -s "../manpages/param.xsl");
-close (F);
-foreach my $param (/<xsl:param name="[^\"]+"/gs) {
-    $param =~ /name=\"(.*)\"/;
-    print "    <member>$1</member>\n", 
-}
-
-print <<EOF5;
-  </simplelist>
-</xsl:variable>
-
-<xsl:variable name="xsl-wordml-parameters-list">
-  <simplelist>
-EOF5
-
-open (F, "../wordml/param.xsl");
-read (F, $_, -s "../wordml/param.xsl");
-close (F);
-foreach my $param (/<xsl:param name="[^\"]+"/gs) {
-    $param =~ /name=\"(.*)\"/;
-    print "    <member>$1</member>\n", 
-}
-
-print <<EOF4;
-  </simplelist>
-</xsl:variable>
-
-<xsl:variable name="xsl-html-parameters"
-              select="exsl:node-set(\$xsl-html-parameters-list)/simplelist"/>
-
-<xsl:variable name="xsl-fo-parameters"
-              select="exsl:node-set(\$xsl-fo-parameters-list)/simplelist"/>
-
-<xsl:variable name="xsl-manpages-parameters"
-              select="exsl:node-set(\$xsl-manpages-parameters-list)/simplelist"/>
-
-<xsl:variable name="xsl-wordml-parameters"
-              select="exsl:node-set(\$xsl-wordml-parameters-list)/simplelist"/>
-
-<xsl:template name="is-html-parameter">
-  <xsl:param name="param" select="''"/>
-
-  <xsl:choose>
-    <xsl:when test="\$xsl-html-parameters/member[. = \$param]">1</xsl:when>
-    <xsl:otherwise>0</xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-
-<xsl:template name="is-fo-parameter">
-  <xsl:param name="param" select="''"/>
-
-  <xsl:choose>
-    <xsl:when test="\$xsl-fo-parameters/member[. = \$param]">1</xsl:when>
-    <xsl:otherwise>0</xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-
-<xsl:template name="is-manpages-parameter">
-  <xsl:param name="param" select="''"/>
-
-  <xsl:choose>
-    <xsl:when test="\$xsl-manpages-parameters/member[. = \$param]">1</xsl:when>
-    <xsl:otherwise>0</xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-
-<xsl:template name="is-wordml-parameter">
-  <xsl:param name="param" select="''"/>
-
-  <xsl:choose>
-    <xsl:when test="\$xsl-wordml-parameters/member[. = \$param]">1</xsl:when>
-    <xsl:otherwise>0</xsl:otherwise>
-  </xsl:choose>
-</xsl:template>
-</xsl:stylesheet>
-EOF4
diff --git a/xsl/docsrc/make-xsl-params.xsl b/xsl/docsrc/make-xsl-params.xsl
new file mode 100644 (file)
index 0000000..3f8e422
--- /dev/null
@@ -0,0 +1,136 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:exsl="http://exslt.org/common"
+                xmlns:xslt="dummy"
+                version="1.0">
+  <xsl:output indent="yes"/>
+  <xsl:namespace-alias stylesheet-prefix="xslt" result-prefix="xsl"/>
+  <!-- ********************************************************************
+       $Id$
+       ********************************************************************
+
+       This file is part of the XSL DocBook Stylesheet distribution.
+       See ../README or http://docbook.sf.net/release/xsl/current/ for
+       copyright and other information.
+
+       ******************************************************************** -->
+
+  <!-- ==================================================================== -->
+
+  <!-- * This stylesheet expects itself as input  -->
+  <xsl:param name="param.dirs">html fo manpages wordml</xsl:param>
+
+  <xsl:template match="/">
+    <xslt:stylesheet version="1.0"> 
+      <xsl:text>&#xa;</xsl:text>
+      <xsl:comment> *           Do not edit this file. </xsl:comment>
+      <xsl:text>&#xa;</xsl:text>
+      <xsl:comment> * It was generated automatically by the build. </xsl:comment>
+      <xsl:text>&#xa;</xsl:text>
+      <xsl:comment> * Edit the make-xsl-params.xsl file instead. </xsl:comment>
+
+      <!-- * Process params for each output format listed in $param.dirs -->
+      <!-- * by splitting the value of $param.dirs into two parts: the part -->
+      <!-- * before the first space (first directory name in the list), and -->
+      <!-- * the part after the first space (all other directory names) -->
+      <xsl:call-template name="make.param.list">
+        <xsl:with-param name="dir">
+          <xsl:choose>
+            <xsl:when test="contains($param.dirs, ' ')">
+              <xsl:value-of select="normalize-space(substring-before($param.dirs, ' '))"/>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:value-of select="$param.dirs"/>
+            </xsl:otherwise>
+          </xsl:choose>
+        </xsl:with-param>
+        <xsl:with-param
+            name="remaining.dirs"
+            select="concat(normalize-space(substring-after($param.dirs, ' ')),' ')"/>
+      </xsl:call-template>
+      <xsl:call-template name="make.is.parameter.template">
+        <xsl:with-param name="dir">
+          <xsl:choose>
+            <xsl:when test="contains($param.dirs, ' ')">
+              <xsl:value-of select="normalize-space(substring-before($param.dirs, ' '))"/>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:value-of select="$param.dirs"/>
+            </xsl:otherwise>
+          </xsl:choose>
+        </xsl:with-param>
+        <xsl:with-param
+            name="remaining.dirs"
+            select="concat(normalize-space(substring-after($param.dirs, ' ')),' ')"/>
+      </xsl:call-template>
+    </xslt:stylesheet>
+  </xsl:template>
+
+  <!-- ==================================================================== -->
+
+  <!-- * The following templates do tail-recursion through a space-separated -->
+  <!-- * list of directories, popping off directory names until they -->
+  <!-- * deplete the list. -->
+  
+  <xsl:template name="make.param.list">
+    <!-- * For each directory, construct a relative URL for a -->
+    <!-- * param.xsl file, then read through that param.xsl file -->
+    <!-- * to collect parameter names. -->
+    <xsl:param name="dir"/>
+    <xsl:param name="remaining.dirs"/>
+    <!-- * When the value of $dir reaches empty, then we have depleted -->
+    <!-- * the list of directories and it's time to stop recursing -->
+    <xsl:if test="not($dir = '')">
+      <xsl:variable name="param.xsl" select="concat('../', $dir, '/', 'param.xsl')"/>
+      <xslt:variable name="xsl-{$dir}-parameters-list">
+        <simplelist role="param">
+          <xsl:for-each select="document($param.xsl)//*[local-name() = 'param']">
+            <xsl:sort select="@name"/>
+            <member><xsl:value-of select="@name"/></member>
+          </xsl:for-each>
+        </simplelist>
+      </xslt:variable>
+      <xslt:variable name="xsl-{$dir}-parameters"
+                     select="exsl:node-set($xsl-{$dir}-parameters-list)/simplelist"/>
+      <xsl:call-template name="make.param.list">
+        <!-- * pop the name of the next directory off the list of -->
+        <!-- * remaining directories -->
+        <xsl:with-param
+            name="dir"
+            select="substring-before($remaining.dirs, ' ')"/>
+        <!-- * remove the current directory from the list of -->
+        <!-- * remaining directories -->
+        <xsl:with-param
+            name="remaining.dirs"
+            select="substring-after($remaining.dirs, ' ')"/>
+      </xsl:call-template>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="make.is.parameter.template">
+    <xsl:param name="dir"/>
+    <xsl:param name="remaining.dirs"/>
+    <xsl:if test="not($dir = '')">
+      <!-- * for each directory, construct a template. -->
+      <xslt:template name="is-{$dir}-parameter">
+        <xslt:param name="param" select="''"/>
+        <xslt:choose>
+          <xslt:when test="$xsl-{$dir}-parameters/member[. = $param]">1</xslt:when>
+          <xslt:otherwise>0</xslt:otherwise>
+        </xslt:choose>
+      </xslt:template>
+      <xsl:call-template name="make.is.parameter.template">
+        <!-- * pop the name of the next directory off the list of -->
+        <!-- * remaining directories -->
+        <xsl:with-param
+            name="dir"
+            select="substring-before($remaining.dirs, ' ')"/>
+        <!-- * remove the current directory from the list of -->
+        <!-- * remaining directories -->
+        <xsl:with-param
+            name="remaining.dirs"
+            select="substring-after($remaining.dirs, ' ')"/>
+      </xsl:call-template>
+    </xsl:if>
+  </xsl:template>
+</xsl:stylesheet>