From 9c1a8467c851590a41891c8d8c2ec49964060fbf Mon Sep 17 00:00:00 2001
From: Dave Kuhlman <dkuhlman@davekuhlman.org>
Date: Thu, 1 Jun 2017 09:04:09 -0700
Subject: [PATCH] Prior to release of v. 2.27a

--HG--
branch : oneper
---
 README.rst                               |  34 ++++
 django/gends_extract_simple_types.py     |  11 +-
 django/gends_run_gen_django.py           |  18 +-
 generateDS.html                          | 192 ++++++++++++++----
 generateDS.py                            |  55 ++++-
 generateDS.txt                           | 130 +++++++++++-
 generateds_gui_notes.html                |   6 +-
 generateds_gui_notes.txt                 |   2 +-
 gui/generateds_gui.py                    |   2 +-
 librarytemplate_howto.html               |   6 +-
 librarytemplate_howto.txt                |   2 +-
 process_includes.py                      |  25 +--
 setup.py                                 |   2 +-
 tests/OnePer/oneperType00_2One.py        |  31 ++-
 tests/OnePer/oneperType01_2One.py        |  34 +++-
 tests/OnePer/oneperType02_2One.py        |  34 +++-
 tests/OnePer/oneperType03_2One.py        |  34 +++-
 tests/abstract_type1_sup.py              |  40 +++-
 tests/annotations1_sup.py                |  37 +++-
 tests/anonymous_type1_sup.py             |  40 +++-
 tests/anysimpletype1_sup.py              |  34 +++-
 tests/anywildcard1_sup.py                |  46 ++++-
 tests/attr_groups1_sup.py                |  31 ++-
 tests/catalogtest1_sup.py                |  28 ++-
 tests/cdata1_sup.py                      |  34 +++-
 tests/cleanupname1_sup.py                |  46 ++++-
 tests/defaults_cases1_sup.py             |  37 +++-
 tests/defaults_coverage1_sup.py          |  37 +++-
 tests/extensions1_sup.py                 |  64 +++++-
 tests/ipo1_sup.py                        |  49 ++++-
 tests/ipo2_sup.py                        |  49 ++++-
 tests/mapcleanname1_sup.py               |  49 ++++-
 tests/nested_def1_sup.py                 |  43 +++-
 tests/out1_sup.py                        |  64 +++++-
 tests/people_procincl1_sup.py            |  76 ++++++-
 tests/prefix_classname1_sup.py           |  64 +++++-
 tests/recursive_simpletype1_sup.py       |  31 ++-
 tests/reference_simpletype1_sup.py       |  31 ++-
 tests/rem_dup_elems1_sup.py              |  34 +++-
 tests/simplecontent_restriction1_sup.py  |  37 +++-
 tests/simpletype_memberspecs1_sup.py     |  34 +++-
 tests/simpletypes_other1_sup.py          |  34 +++-
 tests/to_etree1_sup.py                   |  28 ++-
 tests/validate_simpletypes1_sup.py       |  40 +++-
 tests/validate_simpletypes1_warnings.txt |  60 +++---
 tests/validate_simpletypes2_sup.py       |  40 +++-
 tutorial/generateds_tutorial.html        |   6 +-
 tutorial/generateds_tutorial.txt         |   2 +-
 tutorial/generateds_tutorial.zip         | Bin 48768 -> 48765 bytes
 updateversion.py                         |   7 +-
 utils/README.txt                         | 110 ++++++++++
 utils/batch_generate.py                  | 243 +++++++++++++++++++++++
 utils/collect_schema_locations.py        | 155 +++++++++++++++
 utils/show_schema_hierarchy.py           | 138 +++++++++++++
 54 files changed, 2362 insertions(+), 154 deletions(-)
 create mode 100644 utils/README.txt
 create mode 100755 utils/batch_generate.py
 create mode 100755 utils/collect_schema_locations.py
 create mode 100755 utils/show_schema_hierarchy.py

diff --git a/README.rst b/README.rst
index f352ecf..17b8110 100644
--- a/README.rst
+++ b/README.rst
@@ -141,6 +141,40 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.27a (06/01/2017)
+
+- Fixed bug in gends_extract_simple_types.py that caused an
+  exception when the simpleType name has a namespace prefix.
+  Thanks to Rémy Gibault for reporting this.
+- Added two utilities that can be used to replace the capability
+  invoked by the --one-file-per-xsd command line option.
+  utils/collect_schema_locations.py can be used to collect and write
+  out the top level schema locations.  batch_generate.py can be used
+  to (read the output from collect_schema_locations.py and generate
+  modules.  Use --help to obtain more information from each of
+  these.  For instructions on this, see the docs and also the README
+  in the utils/ subdirectory.
+- Various fixes for the generation of namespace prefix definitions
+  when the generated export functions are called.  Thanks to Eugene
+  Petkevich for reporting and working with me on this.
+- Added command line option --no-namespace-defs to force export
+  functions to not added namespace prefix defintions.
+- Added ability for generated modules to import a module
+  (generatedsnamespaces.py) containing a dictionary
+  (GenerateDSNamespaceDefs) that maps element type names to the
+  namespace prefix definitions (or any XML attributes, actually)
+  that are to be added to specific elements during export.  See the
+  docs and also notes near where generatedsnamespaces.py is imported
+  in a generated module.
+- Fixed an error in gends_run_gen_django.py which caused it to fail
+  when generateDS.py produced a warning message.  Thanks to Rémy
+  Gibault for catching and reporting this.
+- Added a utility to help with analyzing complex schemas.
+  utils/show_schema_hierarchy.py can by used to show an indented
+  hierarchy of schemas that are pulled in by xs:include and
+  xs:import elements.  Type `utils/show_schema_hierarchy.py --help`
+  for more info.  Also see the docs.
+
 Version 2.26a (05/09/2017)
 
 - Added command line options --no-collect-includes and
diff --git a/django/gends_extract_simple_types.py b/django/gends_extract_simple_types.py
index 07865cb..a210580 100755
--- a/django/gends_extract_simple_types.py
+++ b/django/gends_extract_simple_types.py
@@ -274,9 +274,16 @@ def resolve_1_simple_type(descriptor, resolved, unresolved):
         resolved[descriptor.name] = descriptor
         return type_obj
     else:
-        #import pdb; pdb.set_trace()
+        type_name = descriptor.type_name
+        if type_name not in unresolved:
+            # If we can't find it, try after stripping off namespace prefix.
+            type_name = type_name.split(':')[-1]
+            if type_name not in unresolved:
+                raise XmlSchemaError(
+                    "Can't find simple type (%s) in unresolved types." % (
+                        type_name))
         type_obj = resolve_1_simple_type(
-            unresolved[descriptor.type_name],
+            unresolved[type_name],
             resolved, unresolved)
         descriptor.type_obj = type_obj
         resolved[descriptor.name] = descriptor
diff --git a/django/gends_run_gen_django.py b/django/gends_run_gen_django.py
index 2786368..51ed73f 100755
--- a/django/gends_run_gen_django.py
+++ b/django/gends_run_gen_django.py
@@ -32,6 +32,7 @@ import sys
 import getopt
 import os
 from subprocess import Popen, PIPE
+from glob import glob
 
 
 #
@@ -61,7 +62,16 @@ def generate(options, schema_file_name):
     admin_file_name = 'admin.py'
     dbg_msg(options, 'schema_name_stem: %s\n' % (schema_name_stem, ))
     dbg_msg(options, 'bindings_file_name: %s\n' % (bindings_file_name, ))
-    if not options['force']:
+    if options['force']:
+        file_names = (
+            glob(bindings_file_name) +
+            glob('%s.pyc' % bindings_file_stem) +
+            glob('__pycache__/%s.*.pyc' % bindings_file_stem)
+        )
+        for file_name in file_names:
+            dbg_msg(options, 'removing: %s\n' % file_name)
+            os.remove(file_name)
+    else:
         flag1 = exists(bindings_file_name)
         flag2 = exists(model_file_name)
         flag3 = exists(form_file_name)
@@ -101,14 +111,12 @@ def run_cmd(options, args):
     content2 = process.stdout.read()
     if content1:
         sys.stderr.write('*** error ***\n')
-        sys.stderr.write(content1)
+        sys.stderr.write(content1.decode('utf-8'))
         sys.stderr.write('*** error ***\n')
-        return False
     if content2:
         dbg_msg(options, '*** message ***\n')
-        dbg_msg(options, content2)
+        dbg_msg(options, content2.decode('utf-8'))
         dbg_msg(options, '*** message ***\n')
-        return True
     return True
 
 
diff --git a/generateDS.html b/generateDS.html
index cd00184..1469649 100644
--- a/generateDS.html
+++ b/generateDS.html
@@ -220,7 +220,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.26a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.27a</td>
 </tr>
 </tbody>
 </table>
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">May 09, 2017</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">June 01, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -357,35 +357,40 @@ to process the contents of an XML document.</td>
 <li><a class="reference internal" href="#id4" id="id78">12.7&nbsp;&nbsp;&nbsp;Mixed content</a></li>
 <li><a class="reference internal" href="#id6" id="id79">12.8&nbsp;&nbsp;&nbsp;anyAttribute</a></li>
 <li><a class="reference internal" href="#user-methods" id="id80">12.9&nbsp;&nbsp;&nbsp;User Methods</a></li>
-<li><a class="reference internal" href="#overridable-methods" id="id81">12.10&nbsp;&nbsp;&nbsp;Overridable methods</a></li>
+<li><a class="reference internal" href="#overridable-methods-generatedssuper-py" id="id81">12.10&nbsp;&nbsp;&nbsp;Overridable methods -- generatedssuper.py</a></li>
 <li><a class="reference internal" href="#the-element-name-to-class-name-dictionary" id="id82">12.11&nbsp;&nbsp;&nbsp;The element name to class name dictionary</a></li>
+<li><a class="reference internal" href="#adding-custom-exported-attributes-and-namespace-prefix-definitions" id="id83">12.12&nbsp;&nbsp;&nbsp;Adding custom exported attributes and namespace prefix definitions</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#one-per-generating-separate-files-from-imported-included-schemas" id="id83">13&nbsp;&nbsp;&nbsp;&quot;One Per&quot; -- generating separate files from imported/included schemas</a></li>
-<li><a class="reference internal" href="#how-to-modify-the-generated-code" id="id84">14&nbsp;&nbsp;&nbsp;How to modify the generated code</a><ul class="auto-toc">
-<li><a class="reference internal" href="#adding-features-to-class-definitions" id="id85">14.1&nbsp;&nbsp;&nbsp;Adding features to class definitions</a></li>
+<li><a class="reference internal" href="#one-per-generating-separate-files-from-imported-included-schemas" id="id84">13&nbsp;&nbsp;&nbsp;&quot;One Per&quot; -- generating separate files from imported/included schemas</a><ul class="auto-toc">
+<li><a class="reference internal" href="#approach-1-command-line-option-one-file-per-xsd" id="id85">13.1&nbsp;&nbsp;&nbsp;Approach 1 -- Command line option --one-file-per-xsd</a></li>
+<li><a class="reference internal" href="#approach-2-extraction-and-generation-utilities" id="id86">13.2&nbsp;&nbsp;&nbsp;Approach 2 -- Extraction and generation utilities</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#examples-and-demonstrations" id="id86">15&nbsp;&nbsp;&nbsp;Examples and demonstrations</a><ul class="auto-toc">
-<li><a class="reference internal" href="#django-generating-models-and-forms" id="id87">15.1&nbsp;&nbsp;&nbsp;Django -- Generating Models and Forms</a><ul class="auto-toc">
-<li><a class="reference internal" href="#how-to-generate-django-models-and-forms" id="id88">15.1.1&nbsp;&nbsp;&nbsp;How to generate Django models and forms</a></li>
-<li><a class="reference internal" href="#how-it-works" id="id89">15.1.2&nbsp;&nbsp;&nbsp;How it works</a></li>
+<li><a class="reference internal" href="#how-to-modify-the-generated-code" id="id87">14&nbsp;&nbsp;&nbsp;How to modify the generated code</a><ul class="auto-toc">
+<li><a class="reference internal" href="#adding-features-to-class-definitions" id="id88">14.1&nbsp;&nbsp;&nbsp;Adding features to class definitions</a></li>
 </ul>
 </li>
+<li><a class="reference internal" href="#examples-and-demonstrations" id="id89">15&nbsp;&nbsp;&nbsp;Examples and demonstrations</a><ul class="auto-toc">
+<li><a class="reference internal" href="#django-generating-models-and-forms" id="id90">15.1&nbsp;&nbsp;&nbsp;Django -- Generating Models and Forms</a><ul class="auto-toc">
+<li><a class="reference internal" href="#how-to-generate-django-models-and-forms" id="id91">15.1.1&nbsp;&nbsp;&nbsp;How to generate Django models and forms</a></li>
+<li><a class="reference internal" href="#how-it-works" id="id92">15.1.2&nbsp;&nbsp;&nbsp;How it works</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#sample-code-and-extensions" id="id90">16&nbsp;&nbsp;&nbsp;Sample code and extensions</a><ul class="auto-toc">
-<li><a class="reference internal" href="#capturing-xs-date-elements-as-dates" id="id91">16.1&nbsp;&nbsp;&nbsp;Capturing xs:date elements as dates</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#limitations-of-generateds" id="id92">17&nbsp;&nbsp;&nbsp;Limitations of generateDS</a><ul class="auto-toc">
-<li><a class="reference internal" href="#xml-schema-limitations" id="id93">17.1&nbsp;&nbsp;&nbsp;XML Schema limitations</a></li>
+<li><a class="reference internal" href="#sample-code-and-extensions" id="id93">16&nbsp;&nbsp;&nbsp;Sample code and extensions</a><ul class="auto-toc">
+<li><a class="reference internal" href="#capturing-xs-date-elements-as-dates" id="id94">16.1&nbsp;&nbsp;&nbsp;Capturing xs:date elements as dates</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#includes-the-xml-schema-xs-include-and-xs-import-elements" id="id94">18&nbsp;&nbsp;&nbsp;Includes -- The XML schema xs:include and xs:import elements</a></li>
-<li><a class="reference internal" href="#processing-relaxng-schemas" id="id95">19&nbsp;&nbsp;&nbsp;Processing RelaxNG schemas</a></li>
-<li><a class="reference internal" href="#acknowledgments" id="id96">20&nbsp;&nbsp;&nbsp;Acknowledgments</a></li>
-<li><a class="reference internal" href="#see-also" id="id97">21&nbsp;&nbsp;&nbsp;See also</a></li>
+<li><a class="reference internal" href="#limitations-of-generateds" id="id95">17&nbsp;&nbsp;&nbsp;Limitations of generateDS</a><ul class="auto-toc">
+<li><a class="reference internal" href="#xml-schema-limitations" id="id96">17.1&nbsp;&nbsp;&nbsp;XML Schema limitations</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#includes-the-xml-schema-xs-include-and-xs-import-elements" id="id97">18&nbsp;&nbsp;&nbsp;Includes -- The XML schema xs:include and xs:import elements</a></li>
+<li><a class="reference internal" href="#processing-relaxng-schemas" id="id98">19&nbsp;&nbsp;&nbsp;Processing RelaxNG schemas</a></li>
+<li><a class="reference internal" href="#acknowledgments" id="id99">20&nbsp;&nbsp;&nbsp;Acknowledgments</a></li>
+<li><a class="reference internal" href="#see-also" id="id100">21&nbsp;&nbsp;&nbsp;See also</a></li>
 </ul>
 </div>
 <div class="section" id="introduction">
@@ -610,6 +615,10 @@ Options:
                              the export() method by the generated
                              parse() and parseString() functions.
                              Default=''.
+    --no-namespace-defs      Do not pass namespace definitions as the value
+                             for the namespacedef_ parameter of the export
+                             method, even if it can be extraced from the
+                             schema.
     --external-encoding=&lt;encoding&gt;
                              Encode output written by the generated export
                              methods using this encoding.  Default, if omitted,
@@ -850,6 +859,14 @@ specified, then the export function will insert a namespace
 prefix definition attribute in the top-most (outer-most)
 element.  (Actually, you can insert any attribute.) The default
 is an empty string.</dd>
+<dt>no-namespace-defs</dt>
+<dd>Do not pass namespace definitions as the value for the
+<tt class="docutils literal">namespacedef_</tt> parameter of the export method, even if it can
+be extraced from the schema.  The default is off.  You might
+want to consider using this in combination with the ability to
+attach namespace prefix definitions to specific element types
+during export, as described here: <a class="reference internal" href="#adding-custom-exported-attributes-and-namespace-prefix-definitions">Adding custom exported
+attributes and namespace prefix definitions</a>.</dd>
 <dt>external-encoding=&lt;encoding&gt;</dt>
 <dd>If an XML instance document contains character data or
 attribute values that are not in the ASCII character set, then
@@ -887,7 +904,7 @@ tree with the node's <tt class="docutils literal">getiterator</tt>, <tt class="d
 and use any of lxml's other capabilities.</li>
 </ul>
 <p class="last">For example: <tt class="docutils literal"><span class="pre">--export=&quot;write</span> etree&quot;</tt> and <tt class="docutils literal"><span class="pre">--export=&quot;write&quot;</span></tt>.  The
-default is: <tt class="docutils literal"><span class="pre">--export=&quot;write</span> literal&quot;</tt>.</p>
+default is: <tt class="docutils literal"><span class="pre">--export=&quot;write&quot;</span></tt>.</p>
 </dd>
 <dt>preserve-cdata-tags</dt>
 <dd>Preserve CDATA tags.  Normally, CDATA tags (&quot;&lt;![CDATA[ ... ]]&gt;&quot;)
@@ -1387,8 +1404,8 @@ off validation.</li>
 generated validation code calls <tt class="docutils literal">gds_validate_xxx</tt>, where &quot;xxx&quot;
 is a base, simple type.  In some cases, you will be able to add
 additional code to that method to perform custom checking.  See
-section <a class="reference internal" href="#overridable-methods">Overridable methods</a> for information on how to use and
-override that class.</li>
+section <a class="reference internal" href="#overridable-methods-generatedssuper-py">Overridable methods -- generatedssuper.py</a> for
+information on how to use and override that class.</li>
 <li>When validation finds data that fails to validate, it generates a
 warning (using the <tt class="docutils literal">warnings</tt> module from the Python standard
 library), not an exception, so that processing continues.</li>
@@ -2050,9 +2067,9 @@ instance document, it generates a call to a method <tt class="docutils literal">
 in the <tt class="docutils literal">GeneratedsSuper</tt> class.  This method has a default
 implementation in the generated code.  If your XML schema uses
 <tt class="docutils literal">xs:any</tt>, you may need to add some code to that default
-implementation of <tt class="docutils literal">gds_build_any</tt>.  See section <a class="reference internal" href="#overridable-methods">Overridable
-methods</a> for guidance on how to provide an implementation of that
-method.</p>
+implementation of <tt class="docutils literal">gds_build_any</tt>.  See section <a class="reference internal" href="#overridable-methods-generatedssuper-py">Overridable
+methods -- generatedssuper.py</a> for guidance on how to provide an
+implementation of that method.</p>
 <p>For more help with this, look at the code generated from an XML
 schema that uses <tt class="docutils literal">xs:any</tt>.  In particular, look at the code
 generated in the Python class corresponding to the
@@ -2688,8 +2705,8 @@ source code and the class_name pattern in each specification.</li>
 <li>Repeat as necessary.</li>
 </ol>
 </div>
-<div class="section" id="overridable-methods">
-<h2><a class="toc-backref" href="#id81">12.10&nbsp;&nbsp;&nbsp;Overridable methods</a></h2>
+<div class="section" id="overridable-methods-generatedssuper-py">
+<h2><a class="toc-backref" href="#id81">12.10&nbsp;&nbsp;&nbsp;Overridable methods -- generatedssuper.py</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> generates calls to several methods that each have
 a default implementation in a superclass.  The default superclass
 with default implementations is included in the generated code.
@@ -2815,9 +2832,58 @@ that complexType definition.  This dictionary is named
 <tt class="docutils literal">GDSClassesMapping</tt>.  You will find it in the module generated
 with the &quot;-o&quot; option.</p>
 </div>
+<div class="section" id="adding-custom-exported-attributes-and-namespace-prefix-definitions">
+<h2><a class="toc-backref" href="#id83">12.12&nbsp;&nbsp;&nbsp;Adding custom exported attributes and namespace prefix definitions</a></h2>
+<p>You can add additional attributes to exported XML content by (1)
+providing a module named <tt class="docutils literal">generatedsnamespaces.py</tt>; (2) placing
+that module somewhere so that it can be imported when you &quot;run&quot; your
+generated module; and (3) including in <tt class="docutils literal">generatedsnamespaces.py</tt> a
+global variable named <tt class="docutils literal">GenerateDSNamespaceDefs</tt> whose value is a
+Python dictionary.  The keys in this dictionary should be element
+type names in the generated module.  And the values should be text
+strings that are attributes to be added to exported elements of that
+type.</p>
+<p>Here is an example:</p>
+<pre class="literal-block">
+# file: generatedsnamespaces.py
+
+GenerateDSNamespaceDefs = {
+    &quot;A1ElementType&quot;: 'xmlns:abc=&quot;http://www.abc.com/namespace_a1&quot;',
+    &quot;A2ElementType&quot;: 'xmlns:abc=&quot;http://www.abc.com/namespace_a2&quot;',
+}
+</pre>
+<p>Notes:</p>
+<ul class="simple">
+<li>While the original intension of this facility was to enable the
+user to add XML namespace prefix definitions to the XML content in
+exported files, you can use it to add other attribute definitions
+as well.</li>
+<li>If you find that <tt class="docutils literal">generateDS.py</tt> is adding a specific namespace
+prefix definition to many exported XML elements and you want to
+suppress this behavior, take a look at the <tt class="docutils literal"><span class="pre">--no-namespace-defs</span></tt>
+command line option.  In particular, this command line option may
+be useful when used together with the capability described in this
+section (<tt class="docutils literal">generatedsnamespaces.py</tt>).</li>
+</ul>
+</div>
 </div>
 <div class="section" id="one-per-generating-separate-files-from-imported-included-schemas">
-<h1><a class="toc-backref" href="#id83">13&nbsp;&nbsp;&nbsp;&quot;One Per&quot; -- generating separate files from imported/included schemas</a></h1>
+<h1><a class="toc-backref" href="#id84">13&nbsp;&nbsp;&nbsp;&quot;One Per&quot; -- generating separate files from imported/included schemas</a></h1>
+<p>The <tt class="docutils literal">generateDS.py</tt> project provides support for two approaches to
+this task:</p>
+<ul class="simple">
+<li>The first (<a class="reference internal" href="#approach-1-command-line-option-one-file-per-xsd">Approach 1 -- Command line option
+--one-file-per-xsd</a>, below) is likely to be easier to use, but if
+it does not work for you as is, it is very difficult to customize.</li>
+<li>The second method (<a class="reference internal" href="#approach-2-extraction-and-generation-utilities">Approach 2 -- Extraction and generation
+utilities</a>, below) may require a little more work and
+understanding, but offers more options and customization, and,
+since the scripts that implement it are short and rather simple,
+may be easier to customize or even re-write for your specific
+needs.</li>
+</ul>
+<div class="section" id="approach-1-command-line-option-one-file-per-xsd">
+<h2><a class="toc-backref" href="#id85">13.1&nbsp;&nbsp;&nbsp;Approach 1 -- Command line option --one-file-per-xsd</a></h2>
 <p>The <tt class="docutils literal"><span class="pre">--one-file-per-xsd</span></tt> command line option enables you to
 generate a separate Python module for each XML schema that is
 imported or included (using <tt class="docutils literal">&lt;xs:import&gt;</tt> or <tt class="docutils literal">&lt;xs:include&gt;</tt>) by
@@ -2869,12 +2935,54 @@ directory into a Python package.</p>
 </li>
 </ul>
 </div>
+<div class="section" id="approach-2-extraction-and-generation-utilities">
+<h2><a class="toc-backref" href="#id86">13.2&nbsp;&nbsp;&nbsp;Approach 2 -- Extraction and generation utilities</a></h2>
+<p>The <tt class="docutils literal">generateds/utils</tt> subdirectory contains two utility scripts
+that may help with this task.  The procedure is as follows:</p>
+<ol class="arabic simple">
+<li>First, use <tt class="docutils literal">utils/collect_schema_locations.py</tt> to collect a set
+of directives, one for each (included) schema and each module to
+be generated.  This utility writes out a JSON file that contains
+the directives to be used in the next step.</li>
+<li>Next, use <tt class="docutils literal">utils/batch_generate.py</tt> to generate one module (or
+perhaps two modules, see below) for each directive in that JSON
+file.</li>
+</ol>
+<p>Each of these modules gives a reasonable amount of usage information
+in response to the <tt class="docutils literal"><span class="pre">--help</span></tt> command line option.</p>
+<p>A few hints and suggestions:</p>
+<ul class="simple">
+<li>After generating the JSON directives file you can modify it with
+your text editor.  For example, (1) you can add the name of
+sub-class modules to be generated by <tt class="docutils literal">generateDS.py</tt>; (2) you
+can specify command line options to be used by <tt class="docutils literal">generateDS.py</tt>
+when generating specific modules; and (3) you can add new
+directives to generate additional modules.</li>
+<li>If you find yourself typing the same command line options to
+<tt class="docutils literal">utils/batch_generate.py</tt> over and over, there is a facility to
+put command line options that have long names (i.e., not one
+character names) into a configuration file.  The usage information
+produced by <tt class="docutils literal">utils/batch_generate.py <span class="pre">--help</span></tt> shows an example.
+Then use <tt class="docutils literal">utils/batch_generate.py <span class="pre">--config=myoptins.config</span> ...</tt>
+to feed this configuration file to <tt class="docutils literal">utils/batch_generate.py</tt>.
+The options in this configuration file can be overridden by those
+entered on the command line.</li>
+<li>The JSON directives file can contain comments, even though this is
+not part of the JSON standard.  A comment is any line that begins
+with &quot;//&quot; where the &quot;//&quot; is proceeded only by white space
+characters.  <tt class="docutils literal">utils/batch_generate.py</tt> strips these lines out
+before parsing the JSON file.  However, if you plan to process
+this JSON file with other processes, you will likely either not
+want to add comments or plan to pre-process them in some way.</li>
+</ul>
+</div>
+</div>
 <div class="section" id="how-to-modify-the-generated-code">
-<h1><a class="toc-backref" href="#id84">14&nbsp;&nbsp;&nbsp;How to modify the generated code</a></h1>
+<h1><a class="toc-backref" href="#id87">14&nbsp;&nbsp;&nbsp;How to modify the generated code</a></h1>
 <p>This section attempts to explain how to modify and add features to
 the generated code.</p>
 <div class="section" id="adding-features-to-class-definitions">
-<h2><a class="toc-backref" href="#id85">14.1&nbsp;&nbsp;&nbsp;Adding features to class definitions</a></h2>
+<h2><a class="toc-backref" href="#id88">14.1&nbsp;&nbsp;&nbsp;Adding features to class definitions</a></h2>
 <p>You can add new member definitions to a generated class. Look at
 the 'export' and 'exportLiteral' member functions for examples of
 how to access member variables and how to walk nested
@@ -2919,7 +3027,7 @@ parser, for example, since generating the file.</li>
 </div>
 </div>
 <div class="section" id="examples-and-demonstrations">
-<h1><a class="toc-backref" href="#id86">15&nbsp;&nbsp;&nbsp;Examples and demonstrations</a></h1>
+<h1><a class="toc-backref" href="#id89">15&nbsp;&nbsp;&nbsp;Examples and demonstrations</a></h1>
 <p>Under the directory Demos are several examples:</p>
 <ul class="simple">
 <li>Demos/People provides a simple demonstration of generating
@@ -2945,7 +3053,7 @@ containing explicit control logic, the order in which nodes of
 the parsed XML document are visited is under your control.</li>
 </ul>
 <div class="section" id="django-generating-models-and-forms">
-<h2><a class="toc-backref" href="#id87">15.1&nbsp;&nbsp;&nbsp;Django -- Generating Models and Forms</a></h2>
+<h2><a class="toc-backref" href="#id90">15.1&nbsp;&nbsp;&nbsp;Django -- Generating Models and Forms</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> can be used to generate Django models and Django
 forms that represent the data structures defined in an XML Schema.</p>
 <p><strong>Note:</strong> In order to use this capability, you must obtain the
@@ -2979,7 +3087,7 @@ use the &quot;-p&quot; command line option.  For more information, do:</p>
 python gends_run_gen_django.py --help
 </pre>
 <div class="section" id="how-to-generate-django-models-and-forms">
-<h3><a class="toc-backref" href="#id88">15.1.1&nbsp;&nbsp;&nbsp;How to generate Django models and forms</a></h3>
+<h3><a class="toc-backref" href="#id91">15.1.1&nbsp;&nbsp;&nbsp;How to generate Django models and forms</a></h3>
 <p><strong>Warning:</strong> Running this script attempts to over-write the
 following files in the current directory:</p>
 <ul class="simple">
@@ -3027,7 +3135,7 @@ Django application.</p>
 </ol>
 </div>
 <div class="section" id="how-it-works">
-<h3><a class="toc-backref" href="#id89">15.1.2&nbsp;&nbsp;&nbsp;How it works</a></h3>
+<h3><a class="toc-backref" href="#id92">15.1.2&nbsp;&nbsp;&nbsp;How it works</a></h3>
 <p>Here are a few notes that might be helpful if and when you need to
 do some debugging or extend the current capabilities or write a new
 &quot;meta-app&quot; that uses the same approach but does something new and
@@ -3054,9 +3162,9 @@ root super class of all generated data representation classes.</p>
 </div>
 </div>
 <div class="section" id="sample-code-and-extensions">
-<h1><a class="toc-backref" href="#id90">16&nbsp;&nbsp;&nbsp;Sample code and extensions</a></h1>
+<h1><a class="toc-backref" href="#id93">16&nbsp;&nbsp;&nbsp;Sample code and extensions</a></h1>
 <div class="section" id="capturing-xs-date-elements-as-dates">
-<h2><a class="toc-backref" href="#id91">16.1&nbsp;&nbsp;&nbsp;Capturing xs:date elements as dates</a></h2>
+<h2><a class="toc-backref" href="#id94">16.1&nbsp;&nbsp;&nbsp;Capturing xs:date elements as dates</a></h2>
 <p>The following extension employs a user method (see <a class="reference internal" href="#user-methods">User
 Methods</a>) in order to capture elements defined as xs:date as date
 objects.</p>
@@ -3125,9 +3233,9 @@ import types
 </div>
 </div>
 <div class="section" id="limitations-of-generateds">
-<h1><a class="toc-backref" href="#id92">17&nbsp;&nbsp;&nbsp;Limitations of generateDS</a></h1>
+<h1><a class="toc-backref" href="#id95">17&nbsp;&nbsp;&nbsp;Limitations of generateDS</a></h1>
 <div class="section" id="xml-schema-limitations">
-<h2><a class="toc-backref" href="#id93">17.1&nbsp;&nbsp;&nbsp;XML Schema limitations</a></h2>
+<h2><a class="toc-backref" href="#id96">17.1&nbsp;&nbsp;&nbsp;XML Schema limitations</a></h2>
 <p>There are things in Xschema that are not supported. You will have
 to use a restricted sub-set of Xschema to define your data
 structures. See above for supported features. See people.xsd and
@@ -3137,7 +3245,7 @@ does not work.</p>
 </div>
 </div>
 <div class="section" id="includes-the-xml-schema-xs-include-and-xs-import-elements">
-<h1><a class="toc-backref" href="#id94">18&nbsp;&nbsp;&nbsp;Includes -- The XML schema xs:include and xs:import elements</a></h1>
+<h1><a class="toc-backref" href="#id97">18&nbsp;&nbsp;&nbsp;Includes -- The XML schema xs:include and xs:import elements</a></h1>
 <p>While <tt class="docutils literal">generateDS.py</tt> itself does not process XML Schema
 <tt class="docutils literal">include</tt> elements, the distribution provides a script
 <tt class="docutils literal">process_includes.py</tt> that can be used as a preprocessor.
@@ -3171,7 +3279,7 @@ $ python process_includes.py --help
 </pre>
 </div>
 <div class="section" id="processing-relaxng-schemas">
-<h1><a class="toc-backref" href="#id95">19&nbsp;&nbsp;&nbsp;Processing RelaxNG schemas</a></h1>
+<h1><a class="toc-backref" href="#id98">19&nbsp;&nbsp;&nbsp;Processing RelaxNG schemas</a></h1>
 <p>RelaxNG is a schema definition language and is an alternative to XML
 Schema.  For more information on RelaxNG, see: <a class="reference external" href="http://relaxng.org/">http://relaxng.org/</a>.</p>
 <p><tt class="docutils literal">generateDS.py</tt> does not understand or process RelaxNG schemas.
@@ -3212,7 +3320,7 @@ through <tt class="docutils literal">generateDS.py</tt>:</p>
 <a class="reference external" href="https://github.com/relaxng/jing-trang">https://github.com/relaxng/jing-trang</a></p>
 </div>
 <div class="section" id="acknowledgments">
-<h1><a class="toc-backref" href="#id96">20&nbsp;&nbsp;&nbsp;Acknowledgments</a></h1>
+<h1><a class="toc-backref" href="#id99">20&nbsp;&nbsp;&nbsp;Acknowledgments</a></h1>
 <p>Many thanks to those who have used <tt class="docutils literal">generateDS.py</tt> and have
 contributed their comments and suggestions.  These comments have
 been valuable both in teaching me about things I needed to know in
@@ -3226,7 +3334,7 @@ following among others:</p>
 </ul>
 </div>
 <div class="section" id="see-also">
-<h1><a class="toc-backref" href="#id97">21&nbsp;&nbsp;&nbsp;See also</a></h1>
+<h1><a class="toc-backref" href="#id100">21&nbsp;&nbsp;&nbsp;See also</a></h1>
 <p><a class="reference external" href="http://www.python.org">Python</a>: The Python home page.</p>
 <p><a class="reference external" href="http://www.davekuhlman.org">Dave's Page</a>: My home page, which contains more Python stuff.</p>
 <!-- vim:ft=rst: -->
@@ -3235,7 +3343,7 @@ following among others:</p>
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateDS.txt">View document source</a>.
-Generated on: 2017-05-09 21:57 UTC.
+Generated on: 2017-06-01 16:00 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/generateDS.py b/generateDS.py
index 54f26f7..632f573 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -80,6 +80,10 @@ Options:
                              the export() method by the generated
                              parse() and parseString() functions.
                              Default=''.
+    --no-namespace-defs      Do not pass namespace definitions as the value
+                             for the namespacedef_ parameter of the export
+                             method, even if it can be extraced from the
+                             schema.
     --external-encoding=<encoding>
                              Encode output written by the generated export
                              methods using this encoding.  Default, if omitted,
@@ -213,7 +217,7 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.26a'
+VERSION = '2.27a'
 ##VERSION##
 
 if sys.version_info.major == 2:
@@ -244,6 +248,7 @@ NoVersion = False
 Dirpath = []
 ExternalEncoding = sys.getdefaultencoding()
 Namespacedef = ''
+NoNameSpaceDefs = False
 CleanupNameList = [(re.compile('[-:.]'), '_')]
 
 NamespacesDict = {}
@@ -2846,6 +2851,10 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
     wrt("    def export(self, outfile, level, namespace_='%s', "
         "name_='%s', namespacedef_='%s', pretty_print=True):\n" %
         (namespace, name, nameSpacesDef))
+    wrt("        imported_ns_def_ = GenerateDSNamespaceDefs_.get"
+        "('%s')\n" % (name, ))
+    wrt("        if imported_ns_def_ is not None:\n")
+    wrt("            namespacedef_ = imported_ns_def_\n")
     wrt('        if pretty_print:\n')
     wrt("            eol_ = '\\n'\n")
     wrt('        else:\n')
@@ -5030,7 +5039,34 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {{
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }}
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs \
+as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {{}}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -6478,7 +6514,10 @@ def getUsedNamespacesDefs(element):
 
 def generateFromTree(wrt, prefix, elements, processed):
     for element in elements:
-        nameSpacesDef = getUsedNamespacesDefs(element)
+        if NoNameSpaceDefs:
+            nameSpacesDef = ""
+        else:
+            nameSpacesDef = getUsedNamespacesDefs(element)
         name = element.getCleanName()
         if 1:     # if name not in processed:
             processed.append(name)
@@ -6573,7 +6612,8 @@ def generate(outfileName, subclassFilename, behaviorFilename,
         if not isNewState():
             sys.stderr.write('\n*** maxLoops exceeded.  Something is '
                              'wrong with --one-file-per-xsd.\n\n')
-            sys.stderr.write('*** Failed to process the following element '
+            sys.stderr.write(
+                '*** Failed to process the following element '
                 'definitions:\n    %s\n' % (PostponedExtensions))
             break
         element = PostponedExtensions.pop()
@@ -6960,7 +7000,7 @@ def main():
     global Force, GenerateProperties, SubclassSuffix, RootElement, \
         ValidatorBodiesBasePath, UseGetterSetter, \
         UserMethodsPath, XsdNameSpace, \
-        Namespacedef, NoDates, NoVersion, \
+        Namespacedef, NoNameSpaceDefs, NoDates, NoVersion, \
         TEMPLATE_MAIN, TEMPLATE_SUBCLASS_FOOTER, Dirpath, \
         ExternalEncoding, MemberSpecs, NoQuestions, \
         ExportWrite, ExportEtree, ExportLiteral, \
@@ -6978,7 +7018,7 @@ def main():
                 'root-element=', 'super=',
                 'validator-bodies=', 'use-getter-setter=',
                 'user-methods=', 'no-process-includes', 'silence',
-                'namespacedef=', 'external-encoding=',
+                'namespacedef=', 'no-namespace-defs', 'external-encoding=',
                 'member-specs=', 'no-dates', 'no-versions',
                 'no-questions', 'session=', 'fix-type-names=',
                 'version', 'export=',
@@ -6998,6 +7038,7 @@ def main():
     superModule = '???'
     processIncludes = 1
     namespacedef = ''
+    NoNameSpaceDefs = False
     ExternalEncoding = sys.getdefaultencoding()
     NoDates = False
     NoVersion = False
@@ -7139,6 +7180,8 @@ def main():
             outputText = False
         elif option[0] == "--namespacedef":
             namespacedef = option[1]
+        elif option[0] == "--no-namespace-defs":
+            NoNameSpaceDefs = True
         elif option[0] == '--external-encoding':
             ExternalEncoding = option[1]
         elif option[0] in ('-q', '--no-questions'):
diff --git a/generateDS.txt b/generateDS.txt
index d3a572a..fba8742 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.26a
+:revision: 2.27a
 
 .. version
 
@@ -302,6 +302,10 @@ Here is the usage message displayed by ``generateDS.py``::
                                  the export() method by the generated
                                  parse() and parseString() functions.
                                  Default=''.
+        --no-namespace-defs      Do not pass namespace definitions as the value
+                                 for the namespacedef_ parameter of the export
+                                 method, even if it can be extraced from the
+                                 schema.
         --external-encoding=<encoding>
                                  Encode output written by the generated export
                                  methods using this encoding.  Default, if omitted,
@@ -564,6 +568,15 @@ namespacedef="<http://...>"
     element.  (Actually, you can insert any attribute.) The default
     is an empty string.
 
+no-namespace-defs
+    Do not pass namespace definitions as the value for the
+    ``namespacedef_`` parameter of the export method, even if it can
+    be extraced from the schema.  The default is off.  You might
+    want to consider using this in combination with the ability to
+    attach namespace prefix definitions to specific element types
+    during export, as described here: `Adding custom exported
+    attributes and namespace prefix definitions`_.
+
 external-encoding=<encoding>
     If an XML instance document contains character data or
     attribute values that are not in the ASCII character set, then
@@ -605,7 +618,7 @@ export
       and use any of lxml's other capabilities.
 
     For example: ``--export="write etree"`` and ``--export="write"``.  The
-    default is: ``--export="write literal"``.
+    default is: ``--export="write"``.
 
 preserve-cdata-tags
     Preserve CDATA tags.  Normally, CDATA tags ("<![CDATA[ ... ]]>")
@@ -1160,8 +1173,8 @@ Here is a bit of explanation of what that generated code will do.
   generated validation code calls ``gds_validate_xxx``, where "xxx"
   is a base, simple type.  In some cases, you will be able to add
   additional code to that method to perform custom checking.  See
-  section `Overridable methods`_ for information on how to use and
-  override that class.
+  section `Overridable methods -- generatedssuper.py`_ for
+  information on how to use and override that class.
 
 - When validation finds data that fails to validate, it generates a
   warning (using the ``warnings`` module from the Python standard
@@ -1879,8 +1892,8 @@ in the ``GeneratedsSuper`` class.  This method has a default
 implementation in the generated code.  If your XML schema uses
 ``xs:any``, you may need to add some code to that default
 implementation of ``gds_build_any``.  See section `Overridable
-methods`_ for guidance on how to provide an implementation of that
-method.
+methods -- generatedssuper.py`_ for guidance on how to provide an
+implementation of that method.
 
 For more help with this, look at the code generated from an XML
 schema that uses ``xs:any``.  In particular, look at the code
@@ -2587,8 +2600,8 @@ Suggestion -- How to begin:
 .. _`gends_user_methods.py`: https://bitbucket.org/dkuhlman/generateds/src
 
 
-Overridable methods
-----------------------------
+Overridable methods -- generatedssuper.py
+-------------------------------------------
 
 ``generateDS.py`` generates calls to several methods that each have
 a default implementation in a superclass.  The default superclass
@@ -2723,9 +2736,64 @@ that complexType definition.  This dictionary is named
 with the "-o" option.
 
 
+Adding custom exported attributes and namespace prefix definitions
+--------------------------------------------------------------------
+
+You can add additional attributes to exported XML content by (1)
+providing a module named ``generatedsnamespaces.py``; (2) placing
+that module somewhere so that it can be imported when you "run" your
+generated module; and (3) including in ``generatedsnamespaces.py`` a
+global variable named ``GenerateDSNamespaceDefs`` whose value is a
+Python dictionary.  The keys in this dictionary should be element
+type names in the generated module.  And the values should be text
+strings that are attributes to be added to exported elements of that
+type.
+
+Here is an example::
+
+    # file: generatedsnamespaces.py
+
+    GenerateDSNamespaceDefs = {
+        "A1ElementType": 'xmlns:abc="http://www.abc.com/namespace_a1"',
+        "A2ElementType": 'xmlns:abc="http://www.abc.com/namespace_a2"',
+    }
+
+Notes:
+
+- While the original intension of this facility was to enable the
+  user to add XML namespace prefix definitions to the XML content in
+  exported files, you can use it to add other attribute definitions
+  as well.
+
+- If you find that ``generateDS.py`` is adding a specific namespace
+  prefix definition to many exported XML elements and you want to
+  suppress this behavior, take a look at the ``--no-namespace-defs``
+  command line option.  In particular, this command line option may
+  be useful when used together with the capability described in this
+  section (``generatedsnamespaces.py``).
+
+
 "One Per" -- generating separate files from imported/included schemas
 =======================================================================
 
+The ``generateDS.py`` project provides support for two approaches to
+this task:
+
+- The first (`Approach 1 -- Command line option
+  --one-file-per-xsd`_, below) is likely to be easier to use, but if
+  it does not work for you as is, it is very difficult to customize.
+
+- The second method (`Approach 2 -- Extraction and generation
+  utilities`_, below) may require a little more work and
+  understanding, but offers more options and customization, and,
+  since the scripts that implement it are short and rather simple,
+  may be easier to customize or even re-write for your specific
+  needs.
+
+
+Approach 1 -- Command line option --one-file-per-xsd
+----------------------------------------------------------
+
 The ``--one-file-per-xsd`` command line option enables you to
 generate a separate Python module for each XML schema that is
 imported or included (using ``<xs:import>`` or ``<xs:include>``) by
@@ -2778,6 +2846,52 @@ Here are a few hints, guidelines, and suggestions:
   directory into a Python package.
 
 
+Approach 2 -- Extraction and generation utilities
+---------------------------------------------------
+
+The ``generateds/utils`` subdirectory contains two utility scripts
+that may help with this task.  The procedure is as follows:
+
+1. First, use ``utils/collect_schema_locations.py`` to collect a set
+   of directives, one for each (included) schema and each module to
+   be generated.  This utility writes out a JSON file that contains
+   the directives to be used in the next step.
+
+2. Next, use ``utils/batch_generate.py`` to generate one module (or
+   perhaps two modules, see below) for each directive in that JSON
+   file.
+
+Each of these modules gives a reasonable amount of usage information
+in response to the ``--help`` command line option.
+
+A few hints and suggestions:
+
+- After generating the JSON directives file you can modify it with
+  your text editor.  For example, (1) you can add the name of
+  sub-class modules to be generated by ``generateDS.py``; (2) you
+  can specify command line options to be used by ``generateDS.py``
+  when generating specific modules; and (3) you can add new
+  directives to generate additional modules.
+
+- If you find yourself typing the same command line options to
+  ``utils/batch_generate.py`` over and over, there is a facility to
+  put command line options that have long names (i.e., not one
+  character names) into a configuration file.  The usage information
+  produced by ``utils/batch_generate.py --help`` shows an example.
+  Then use ``utils/batch_generate.py --config=myoptins.config ...``
+  to feed this configuration file to ``utils/batch_generate.py``.
+  The options in this configuration file can be overridden by those
+  entered on the command line.
+
+- The JSON directives file can contain comments, even though this is
+  not part of the JSON standard.  A comment is any line that begins
+  with "//" where the "//" is proceeded only by white space
+  characters.  ``utils/batch_generate.py`` strips these lines out
+  before parsing the JSON file.  However, if you plan to process
+  this JSON file with other processes, you will likely either not
+  want to add comments or plan to pre-process them in some way.
+
+
 How to modify the generated code
 ================================
 
diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html
index a34f76b..275359d 100644
--- a/generateds_gui_notes.html
+++ b/generateds_gui_notes.html
@@ -220,7 +220,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.26a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.27a</td>
 </tr>
 </tbody>
 </table>
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">May 09, 2017</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">June 01, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -401,7 +401,7 @@ $ mv generateds_gui.mo locale/ru/LC_MESSAGES/
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateds_gui_notes.txt">View document source</a>.
-Generated on: 2017-05-09 21:57 UTC.
+Generated on: 2017-06-01 16:00 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt
index 49d17c2..ac0da3a 100644
--- a/generateds_gui_notes.txt
+++ b/generateds_gui_notes.txt
@@ -12,7 +12,7 @@ GenerateDS GUI Notes
 
 .. version
 
-:revision: 2.26a
+:revision: 2.27a
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index 5a7e6a4..a7e3541 100755
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -41,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.26a'
+VERSION = '2.27a'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 5d3738a..8e4978e 100644
--- a/librarytemplate_howto.html
+++ b/librarytemplate_howto.html
@@ -217,7 +217,7 @@ dkuhlman (at) davekuhlman (dot) org
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.26a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.27a</td>
 </tr>
 </tbody>
 </table>
@@ -226,7 +226,7 @@ dkuhlman (at) davekuhlman (dot) org
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">May 09, 2017</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">June 01, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -380,7 +380,7 @@ this command for your needs.  For example, you may need to use
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="librarytemplate_howto.txt">View document source</a>.
-Generated on: 2017-05-09 21:57 UTC.
+Generated on: 2017-06-01 16:00 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index 28383c0..808eeb8 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.26a
+:revision: 2.27a
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index e030a21..43aa474 100755
--- a/process_includes.py
+++ b/process_includes.py
@@ -40,7 +40,7 @@ except ImportError:
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.26a'
+VERSION = '2.27a'
 ##VERSION##
 
 CatalogDict = {}
@@ -89,16 +89,19 @@ def process_include_files(
     return doc
 
 
-def get_all_root_file_paths(infile, inpath='', catalogpath=None):
+def get_all_root_file_paths(
+        infile,
+        inpath='',
+        catalogpath=None,
+        shallow=False):
     load_catalog(catalogpath)
-
     doc1 = etree.parse(infile)
     root1 = doc1.getroot()
     rootPaths = []
     params = Params()
     params.parent_url = infile
     params.base_url = os.path.split(inpath)[0]
-    get_root_file_paths(root1, params, rootPaths)
+    get_root_file_paths(root1, params, rootPaths, shallow)
     rootPaths.append(inpath)
     return rootPaths
 
@@ -266,26 +269,24 @@ def collect_inserts_aux(child, params, inserts, options):
     return roots
 
 
-def get_root_file_paths(node, params, rootPaths):
-
+def get_root_file_paths(node, params, rootPaths, shallow):
     namespace = node.nsmap[node.prefix]
     child_iter1 = node.iterfind('{%s}include' % (namespace, ))
     child_iter2 = node.iterfind('{%s}import' % (namespace, ))
     for child in itertools.chain(child_iter1, child_iter2):
-        get_root_file_paths_aux(child, params, rootPaths)
+        get_root_file_paths_aux(child, params, rootPaths, shallow)
 
 
-def get_root_file_paths_aux(child, params, rootPaths):
+def get_root_file_paths_aux(child, params, rootPaths, shallow):
     save_base_url = params.base_url
     path, _ = get_ref_info(child, params)
     string_content = resolve_ref(child, params, None)
     if string_content is not None:
-        root = etree.fromstring(string_content, base_url=params.base_url)
-        get_root_file_paths(root, params, rootPaths)
-
+        if not shallow:
+            root = etree.fromstring(string_content, base_url=params.base_url)
+            get_root_file_paths(root, params, rootPaths, shallow)
     if path is not None and path not in rootPaths:
         rootPaths.append(path)
-
     params.base_url = save_base_url
 
 
diff --git a/setup.py b/setup.py
index 6be7d96..0e95961 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ setup(name="generateDS",
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.26a",
+    version="2.27a",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py
index 96ad398..143ef3d 100644
--- a/tests/OnePer/oneperType00_2One.py
+++ b/tests/OnePer/oneperType00_2One.py
@@ -56,7 +56,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -699,6 +725,9 @@ class oneperType00_1(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='oneperType00_1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('oneperType00_1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py
index 6b9aec3..40f336a 100644
--- a/tests/OnePer/oneperType01_2One.py
+++ b/tests/OnePer/oneperType01_2One.py
@@ -56,7 +56,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -699,6 +725,9 @@ class oneperType01_1(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='oneperType01_1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('oneperType01_1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -780,6 +809,9 @@ class oneperType01_2(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='oneperType01_2', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('oneperType01_2')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py
index 55cbdf0..55b6045 100644
--- a/tests/OnePer/oneperType02_2One.py
+++ b/tests/OnePer/oneperType02_2One.py
@@ -56,7 +56,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -699,6 +725,9 @@ class oneperType02_1(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='oneperType02_1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('oneperType02_1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -780,6 +809,9 @@ class oneperType02_2(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='oneperType02_2', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('oneperType02_2')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py
index f34f726..5095a66 100644
--- a/tests/OnePer/oneperType03_2One.py
+++ b/tests/OnePer/oneperType03_2One.py
@@ -56,7 +56,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -699,6 +725,9 @@ class oneperType03_1(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='oneperType03_1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('oneperType03_1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -780,6 +809,9 @@ class oneperType03_2(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='oneperType03_2', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('oneperType03_2')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py
index 7d63ed1..643efb6 100644
--- a/tests/abstract_type1_sup.py
+++ b/tests/abstract_type1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -699,6 +725,9 @@ class carrierType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='target:', name_='carrierType', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('carrierType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -786,6 +815,9 @@ class Vehicle(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='target:', name_='Vehicle', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('Vehicle')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -854,6 +886,9 @@ class Car(Vehicle):
         else:
             return False
     def export(self, outfile, level, namespace_='target:', name_='Car', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('Car')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -917,6 +952,9 @@ class Plane(Vehicle):
         else:
             return False
     def export(self, outfile, level, namespace_='target:', name_='Plane', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('Plane')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py
index f7b7f4c..d716c96 100644
--- a/tests/annotations1_sup.py
+++ b/tests/annotations1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -701,6 +727,9 @@ class document1Type(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='document1Type', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('document1Type')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -795,6 +824,9 @@ class document2Type(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='document2Type', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('document2Type')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -893,6 +925,9 @@ class document3Type(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='document3Type', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('document3Type')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py
index 54f4775..ac77e9c 100644
--- a/tests/anonymous_type1_sup.py
+++ b/tests/anonymous_type1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -703,6 +729,9 @@ class FooList(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='FooList', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('FooList')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -799,6 +828,9 @@ class FooType1(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='FooType1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('FooType1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -883,6 +915,9 @@ class BarType2(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='BarType2', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('BarType2')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -967,6 +1002,9 @@ class BazType3(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='BazType3', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('BazType3')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py
index 37b25dc..7122f86 100644
--- a/tests/anysimpletype1_sup.py
+++ b/tests/anysimpletype1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -697,6 +723,9 @@ class test1element(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='test1element', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('test1element')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -779,6 +808,9 @@ class cimAnySimpleType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='cimAnySimpleType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('cimAnySimpleType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py
index fc9d2dd..bc06e7d 100644
--- a/tests/anywildcard1_sup.py
+++ b/tests/anywildcard1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -703,6 +729,9 @@ class PlantType_single(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='PlantType_single', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('PlantType_single')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -805,6 +834,9 @@ class PlantType_multiple(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='PlantType_multiple', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('PlantType_multiple')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -898,6 +930,9 @@ class DescriptionType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='DescriptionType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('DescriptionType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -985,6 +1020,9 @@ class CatalogType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='CatalogType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('CatalogType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1070,6 +1108,9 @@ class PlantType_single_nochild(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='PlantType_single_nochild', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('PlantType_single_nochild')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1147,6 +1188,9 @@ class PlantType_multiple_nochild(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='PlantType_multiple_nochild', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('PlantType_multiple_nochild')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py
index 064f970..49e3fdb 100644
--- a/tests/attr_groups1_sup.py
+++ b/tests/attr_groups1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -729,6 +755,9 @@ class GetUserReq(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='GetUserReq', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('GetUserReq')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py
index 0822668..94fef33 100644
--- a/tests/catalogtest1_sup.py
+++ b/tests/catalogtest1_sup.py
@@ -56,7 +56,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
diff --git a/tests/cdata1_sup.py b/tests/cdata1_sup.py
index 3ddcfae..81149c2 100644
--- a/tests/cdata1_sup.py
+++ b/tests/cdata1_sup.py
@@ -56,7 +56,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -700,6 +726,9 @@ class cdataListType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='cdataListType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('cdataListType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -774,6 +803,9 @@ class cdataType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='cdataType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('cdataType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/cleanupname1_sup.py b/tests/cleanupname1_sup.py
index ce85f41..11983e9 100644
--- a/tests/cleanupname1_sup.py
+++ b/tests/cleanupname1_sup.py
@@ -56,7 +56,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -714,6 +740,9 @@ class dataKind(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='dataType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('dataType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -816,6 +845,9 @@ class data1Kind(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='data1Type', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('data1Type')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -890,6 +922,9 @@ class MlassData2(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='TypeData2', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('TypeData2')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -964,6 +999,9 @@ class RealTypeData3(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='RealTypeData3', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('RealTypeData3')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1038,6 +1076,9 @@ class MMMMMMdataKind(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='AABBCCdataType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('AABBCCdataType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1112,6 +1153,9 @@ class dataTypeNNNMNNN(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='dataTypeXYZAXYZ', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('dataTypeXYZAXYZ')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py
index 6a6b5dc..4482304 100644
--- a/tests/defaults_cases1_sup.py
+++ b/tests/defaults_cases1_sup.py
@@ -54,7 +54,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -709,6 +735,9 @@ class DefaultTypes(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='DefaultTypes', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('DefaultTypes')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -825,6 +854,9 @@ class DefaultType1(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='DefaultType1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('DefaultType1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -984,6 +1016,9 @@ class DefaultType2(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='DefaultType2', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('DefaultType2')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py
index 7808d17..534c099 100644
--- a/tests/defaults_coverage1_sup.py
+++ b/tests/defaults_coverage1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -698,6 +724,9 @@ class DefaultTypes(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='DefaultTypes', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('DefaultTypes')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -883,6 +912,9 @@ class DefaultType1(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='DefaultType1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('DefaultType1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1215,6 +1247,9 @@ class DefaultType2(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='DefaultType2', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('DefaultType2')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index 18b6c74..6eb4a46 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -697,6 +723,9 @@ class SpecialDate(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='SpecialDate', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('SpecialDate')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -772,6 +801,9 @@ class ExtremeDate(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='ExtremeDate', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('ExtremeDate')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -847,6 +879,9 @@ class singleExtremeDate(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='singleExtremeDate', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('singleExtremeDate')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -929,6 +964,9 @@ class containerType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('containerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1041,6 +1079,9 @@ class simpleFactoidType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleFactoidType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleFactoidType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1162,6 +1203,9 @@ class mixedFactoidType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='mixedFactoidType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('mixedFactoidType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1253,6 +1297,9 @@ class BaseType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='BaseType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('BaseType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1349,6 +1396,9 @@ class DerivedType(BaseType):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='DerivedType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('DerivedType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1434,6 +1484,9 @@ class MyInteger(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='MyInteger', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('MyInteger')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1509,6 +1562,9 @@ class MyBoolean(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='MyBoolean', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('MyBoolean')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1584,6 +1640,9 @@ class MyFloat(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='MyFloat', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('MyFloat')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1659,6 +1718,9 @@ class MyDouble(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='MyDouble', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('MyDouble')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py
index a810324..34ba227 100644
--- a/tests/ipo1_sup.py
+++ b/tests/ipo1_sup.py
@@ -54,7 +54,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -715,6 +741,9 @@ class PurchaseOrderType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('PurchaseOrderType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -826,6 +855,9 @@ class Items(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('Items')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -928,6 +960,9 @@ class item(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='item', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('item')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1042,6 +1077,9 @@ class quantity(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('quantity')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1119,6 +1157,9 @@ class Address(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('Address')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1234,6 +1275,9 @@ class USAddress(Address):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('USAddress')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1331,6 +1375,9 @@ class UKAddress(Address):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('UKAddress')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py
index a810324..34ba227 100644
--- a/tests/ipo2_sup.py
+++ b/tests/ipo2_sup.py
@@ -54,7 +54,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -715,6 +741,9 @@ class PurchaseOrderType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('PurchaseOrderType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -826,6 +855,9 @@ class Items(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('Items')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -928,6 +960,9 @@ class item(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='item', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('item')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1042,6 +1077,9 @@ class quantity(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('quantity')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1119,6 +1157,9 @@ class Address(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('Address')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1234,6 +1275,9 @@ class USAddress(Address):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('USAddress')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1331,6 +1375,9 @@ class UKAddress(Address):
         else:
             return False
     def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('UKAddress')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py
index f6017af..96a479b 100644
--- a/tests/mapcleanname1_sup.py
+++ b/tests/mapcleanname1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -714,6 +740,9 @@ class complex_type01(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='complex-type01', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('complex-type01')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -836,6 +865,9 @@ class complex_type02(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='complex-type02', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('complex-type02')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -957,6 +989,9 @@ class complex_type03(complex_type02):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='complex-type03', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('complex-type03')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1074,6 +1109,9 @@ class type_(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='type', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('type')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1195,6 +1233,9 @@ class complex_type04(type_):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='complex-type04', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('complex-type04')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1312,6 +1353,9 @@ class build_(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='build', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('build')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1433,6 +1477,9 @@ class complex_type05(build_):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='complex-type05', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('complex-type05')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py
index 8607979..9ead07e 100644
--- a/tests/nested_def1_sup.py
+++ b/tests/nested_def1_sup.py
@@ -54,7 +54,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -697,6 +723,9 @@ class containerType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('containerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -778,6 +807,9 @@ class classAType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='classAType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('classAType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -852,6 +884,9 @@ class classBType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='classBType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('classBType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -930,6 +965,9 @@ class innerType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='innerType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('innerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1010,6 +1048,9 @@ class innerType1(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='innerType1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('innerType1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index 3530bab..24fa5f7 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -743,6 +769,9 @@ class people(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='people', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('people')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -987,6 +1016,9 @@ class comments(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='comments', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('comments')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1197,6 +1229,9 @@ class person(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='person', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('person')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1578,6 +1613,9 @@ class programmer(person):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1984,6 +2022,9 @@ class param(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='param', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('param')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2178,6 +2219,9 @@ class python_programmer(programmer):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='python-programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('python-programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2334,6 +2378,9 @@ class java_programmer(programmer):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='java-programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('java-programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2506,6 +2553,9 @@ class agent(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='agent', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('agent')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2690,6 +2740,9 @@ class special_agent(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='special-agent', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('special-agent')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2907,6 +2960,9 @@ class booster(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='booster', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('booster')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -3144,6 +3200,9 @@ class info(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='info', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('info')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -3305,6 +3364,9 @@ class client_handlerType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='client-handlerType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('client-handlerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index 6898534..b592f81 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -755,6 +781,9 @@ class people(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='people', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('people')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -897,6 +926,9 @@ class comments(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='comments', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('comments')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1051,6 +1083,9 @@ class person(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='person', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('person')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1208,6 +1243,9 @@ class specialperson(person):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='specialperson', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('specialperson')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1300,6 +1338,9 @@ class param(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='param', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('param')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1433,6 +1474,9 @@ class agent(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='agent', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('agent')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1570,6 +1614,9 @@ class special_agent(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='special-agent', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('special-agent')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1721,6 +1768,9 @@ class booster(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='booster', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('booster')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1866,6 +1916,9 @@ class info(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='info', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('info')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1958,6 +2011,9 @@ class vehicle(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='vehicle', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('vehicle')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2045,6 +2101,9 @@ class automobile(vehicle):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='automobile', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('automobile')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2123,6 +2182,9 @@ class airplane(vehicle):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='airplane', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('airplane')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2297,6 +2359,9 @@ class programmer(person):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2556,6 +2621,9 @@ class client_handlerType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='client-handlerType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('client-handlerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2654,6 +2722,9 @@ class java_programmer(programmer):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='java-programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('java-programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2752,6 +2823,9 @@ class python_programmer(programmer):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='python-programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('python-programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py
index e0fa52d..0c4fe6c 100644
--- a/tests/prefix_classname1_sup.py
+++ b/tests/prefix_classname1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -743,6 +769,9 @@ class tomato_people(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='people', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('people')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -867,6 +896,9 @@ class tomato_comments(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='comments', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('comments')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1013,6 +1045,9 @@ class tomato_person(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='person', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('person')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1278,6 +1313,9 @@ class tomato_programmer(tomato_person):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1565,6 +1603,9 @@ class tomato_param(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='param', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('param')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1678,6 +1719,9 @@ class tomato_python_programmer(tomato_programmer):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='python-programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('python-programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1771,6 +1815,9 @@ class tomato_java_programmer(tomato_programmer):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='java-programmer', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('java-programmer')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1876,6 +1923,9 @@ class tomato_agent(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='agent', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('agent')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1990,6 +2040,9 @@ class tomato_special_agent(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='special-agent', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('special-agent')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2137,6 +2190,9 @@ class tomato_booster(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='booster', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('booster')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2277,6 +2333,9 @@ class tomato_info(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='info', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('info')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -2371,6 +2430,9 @@ class tomato_client_handlerType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='client-handlerType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('client-handlerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py
index b4201cf..d9ed0d7 100644
--- a/tests/recursive_simpletype1_sup.py
+++ b/tests/recursive_simpletype1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -703,6 +729,9 @@ class PersonType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='PersonType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('PersonType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/reference_simpletype1_sup.py b/tests/reference_simpletype1_sup.py
index 6b00823..15f6908 100644
--- a/tests/reference_simpletype1_sup.py
+++ b/tests/reference_simpletype1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -707,6 +733,9 @@ class dummy(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='dummy', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('dummy')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/rem_dup_elems1_sup.py b/tests/rem_dup_elems1_sup.py
index 3740da7..a5fe933 100644
--- a/tests/rem_dup_elems1_sup.py
+++ b/tests/rem_dup_elems1_sup.py
@@ -56,7 +56,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -711,6 +737,9 @@ class authorsType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='authorsType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('authorsType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -792,6 +821,9 @@ class author(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='author', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('author')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py
index 1533d86..c532b53 100644
--- a/tests/simplecontent_restriction1_sup.py
+++ b/tests/simplecontent_restriction1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -724,6 +750,9 @@ class IdentifierType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='IdentifierType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('IdentifierType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -847,6 +876,9 @@ class BillOfResourcesIDType(IdentifierType):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='BillOfResourcesIDType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('BillOfResourcesIDType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -916,6 +948,9 @@ class BillOfMaterialIDType(IdentifierType):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='BillOfMaterialIDType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('BillOfMaterialIDType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index 1aa4264..6d445a1 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -697,6 +723,9 @@ class SpecialDate(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='pl:', name_='SpecialDate', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('SpecialDate')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -772,6 +801,9 @@ class ExtremeDate(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='pl:', name_='ExtremeDate', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('ExtremeDate')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py
index 0c55d98..0b60027 100644
--- a/tests/simpletypes_other1_sup.py
+++ b/tests/simpletypes_other1_sup.py
@@ -55,7 +55,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -699,6 +725,9 @@ class simpleTypeTestsType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleTypeTestsType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleTypeTestsType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -929,6 +958,9 @@ class simpleTypeTestDefs(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleTypeTestDefs', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleTypeTestDefs')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index 347dcdc..016d5f5 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -57,7 +57,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py
index bef973b..6d42d6a 100644
--- a/tests/validate_simpletypes1_sup.py
+++ b/tests/validate_simpletypes1_sup.py
@@ -54,7 +54,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -742,6 +768,9 @@ class containerType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('containerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1150,6 +1179,9 @@ class simpleOneType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleOneType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleOneType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1457,6 +1489,9 @@ class simpleTwoType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleTwoType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleTwoType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1539,6 +1574,9 @@ class simpleTwoElementOneType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleTwoElementOneType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt
index ff17979..04097a2 100644
--- a/tests/validate_simpletypes1_warnings.txt
+++ b/tests/validate_simpletypes1_warnings.txt
@@ -1,60 +1,60 @@
-tests/validate_simpletypes2_sup.py:993: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:1022: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1003: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1032: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1016: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
+tests/validate_simpletypes2_sup.py:1045: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
   warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1023: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:1052: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1028: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
+tests/validate_simpletypes2_sup.py:1057: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1037: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:1066: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1042: UserWarning: Value "012345" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:1071: UserWarning: Value "012345" does not match xsd length restriction on length_st
   warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1119: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:1148: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1113: UserWarning: Value "efgh" does not match xsd pattern restrictions: [['^abcd$|^ef\\|gh$']]
+tests/validate_simpletypes2_sup.py:1142: UserWarning: Value "efgh" does not match xsd pattern restrictions: [['^abcd$|^ef\\|gh$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_vbar_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:995: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:1024: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1003: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1032: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1021: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:1050: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1035: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:1064: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
   warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1042: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:1071: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
   warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1052: UserWarning: Value "2015-05-01" does not match xsd minInclusive restriction on date_minincl_st
+tests/validate_simpletypes2_sup.py:1081: UserWarning: Value "2015-05-01" does not match xsd minInclusive restriction on date_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1057: UserWarning: Value "2015-11-01" does not match xsd maxInclusive restriction on date_maxincl_st
+tests/validate_simpletypes2_sup.py:1086: UserWarning: Value "2015-11-01" does not match xsd maxInclusive restriction on date_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1062: UserWarning: Value "2015-05-01" does not match xsd minExclusive restriction on date_minexcl_st
+tests/validate_simpletypes2_sup.py:1091: UserWarning: Value "2015-05-01" does not match xsd minExclusive restriction on date_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1067: UserWarning: Value "2015-11-01" does not match xsd maxExclusive restriction on date_maxexcl_st
+tests/validate_simpletypes2_sup.py:1096: UserWarning: Value "2015-11-01" does not match xsd maxExclusive restriction on date_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1072: UserWarning: Value "13:30:00" does not match xsd minInclusive restriction on time_minincl_st
+tests/validate_simpletypes2_sup.py:1101: UserWarning: Value "13:30:00" does not match xsd minInclusive restriction on time_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1077: UserWarning: Value "17:00:00" does not match xsd maxInclusive restriction on time_maxincl_st
+tests/validate_simpletypes2_sup.py:1106: UserWarning: Value "17:00:00" does not match xsd maxInclusive restriction on time_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1082: UserWarning: Value "13:30:00" does not match xsd minExclusive restriction on time_minexcl_st
+tests/validate_simpletypes2_sup.py:1111: UserWarning: Value "13:30:00" does not match xsd minExclusive restriction on time_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1087: UserWarning: Value "17:00:00" does not match xsd maxExclusive restriction on time_maxexcl_st
+tests/validate_simpletypes2_sup.py:1116: UserWarning: Value "17:00:00" does not match xsd maxExclusive restriction on time_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1092: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minInclusive restriction on datetime_minincl_st
+tests/validate_simpletypes2_sup.py:1121: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minInclusive restriction on datetime_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1097: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxInclusive restriction on datetime_maxincl_st
+tests/validate_simpletypes2_sup.py:1126: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxInclusive restriction on datetime_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1102: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minExclusive restriction on datetime_minexcl_st
+tests/validate_simpletypes2_sup.py:1131: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minExclusive restriction on datetime_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1107: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxExclusive restriction on datetime_maxexcl_st
+tests/validate_simpletypes2_sup.py:1136: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxExclusive restriction on datetime_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1121: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:1150: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1000: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st
+tests/validate_simpletypes2_sup.py:1029: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1003: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1032: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1533: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
+tests/validate_simpletypes2_sup.py:1568: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py
index bef973b..6d42d6a 100644
--- a/tests/validate_simpletypes2_sup.py
+++ b/tests/validate_simpletypes2_sup.py
@@ -54,7 +54,33 @@ def parsexml_(infile, parser=None, **kwargs):
     return doc
 
 #
-# User methods
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -742,6 +768,9 @@ class containerType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('containerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1150,6 +1179,9 @@ class simpleOneType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleOneType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleOneType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1457,6 +1489,9 @@ class simpleTwoType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleTwoType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleTwoType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
@@ -1539,6 +1574,9 @@ class simpleTwoElementOneType(GeneratedsSuper):
         else:
             return False
     def export(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('simpleTwoElementOneType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
         if pretty_print:
             eol_ = '\n'
         else:
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index 4ee1307..48cc09d 100644
--- a/tutorial/generateds_tutorial.html
+++ b/tutorial/generateds_tutorial.html
@@ -219,7 +219,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.26a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.27a</td>
 </tr>
 </tbody>
 </table>
@@ -228,7 +228,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">May 09, 2017</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">June 01, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -1210,7 +1210,7 @@ named <tt class="docutils literal">garden_api.py</tt>, you can create an instanc
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateds_tutorial.txt">View document source</a>.
-Generated on: 2017-05-09 21:57 UTC.
+Generated on: 2017-06-01 16:00 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index ec5b5db..7bab582 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.26a
+:revision: 2.27a
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 490a139bad4144c6118c1b4a99694371778130b9..6790559d1746dd3a640a3c64508389e1abded303 100644
GIT binary patch
delta 11970
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
UPnDC8xfPR5zAXk|xc~qF0Ao?DbN~PV

delta 11963
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
E1&oZO`~Uy|

diff --git a/updateversion.py b/updateversion.py
index 0ec2618..1ded139 100755
--- a/updateversion.py
+++ b/updateversion.py
@@ -16,6 +16,7 @@ Example:
 #
 # Imports
 
+from __future__ import print_function
 import sys
 import getopt
 import re
@@ -71,7 +72,7 @@ def updateversion(version):
     for spec in REPL_SPEC:
         targetfilename = spec['filename']
         if VERBOSE:
-            print 'updating: "%s"' % (targetfilename, )
+            print('updating: "%s"' % (targetfilename, ))
         targetfile = open(targetfilename, 'r')
         content = targetfile.read()
         targetfile.close()
@@ -100,7 +101,7 @@ def update1file(targetfilename, content):
 def replfuncmaker(version):
     def replfunc(matchobj):
         if VERBOSE:
-            print '(replfunc) matchobj.groups()', matchobj.groups()
+            print('(replfunc) matchobj.groups()', matchobj.groups())
         return matchobj.group(1) + version + matchobj.group(3)
     return replfunc
 
@@ -109,7 +110,7 @@ USAGE_TEXT = __doc__
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/utils/README.txt b/utils/README.txt
new file mode 100644
index 0000000..5629497
--- /dev/null
+++ b/utils/README.txt
@@ -0,0 +1,110 @@
+===================================
+Utility scripts for generateDS.py
+===================================
+
+This document provides an explanation of and instructions on the use
+of several utilities that are in this subdirectory and that preform
+helpful tasks related to ``generateDS.py``.
+
+Note that these utility scripts do not install automatically.  You
+can find them in the ``generateds/utirs`` directory; and you can
+either copy them to some directory on your path or create a
+(symbolic) link to them from some directory on your path.
+
+
+show_schema_hierarchy.py
+==========================
+
+XML schemas often import other schemas which import still other
+schemas etc. to an arbitrary depth.  If you feel it might be helpful
+to learn which schemas are being imported by your schema and
+recursively which schema *they* import, then this utility might be
+helpful.
+
+Run ``python show_schema_hierarchy.py --help`` for usage notes.
+
+
+collect_schema_locations.py
+=============================
+
+This utility scans the top level schema and produces a JSON file
+containing directives.  This directives file can be used by
+``batch_generate.py`` to run ``generateDS.py`` to generate a module
+for each of the schema references that is extracted.
+
+Run ``python collect_schema_locations.py --help`` for usage notes.
+There are some notes in the ``generateDS.py`` documentation.
+
+Here is a sample of the directives file that is produced::
+
+    {
+        "directives": [
+            {
+                "schema": "DtsInstrumentBox.xsd",
+                "outfile": "DtsInstrumentBox.py",
+                "outsubfile": "",
+                "flags": ""
+            },
+            {
+                "schema": "ProdmlCommon.xsd",
+                "outfile": "ProdmlCommon.py",
+                "outsubfile": "",
+                "flags": "-f --member-specs=list --no-namespace-defs"
+            },
+            {
+                "schema": "FiberOpticalPath.xsd",
+                "outfile": "FiberOpticalPath.py",
+                "outsubfile": "",
+                "flags": ""
+            }
+        ]
+    }
+
+
+batch_generate.py
+===================
+
+``batch_generate.py`` runs ``generateDS.py`` to do batch generation
+of multiple modules.  ``batch_generate.py`` determines which modules
+to generate from which schemas by reading directives from a JSON
+file.  
+
+Run ``python batch_generate.py --help`` for usage notes.  And, there
+are a few notes in the ``generateDS.py`` documentation.
+
+
+The directive file
+--------------------
+
+The directives file can be produced by running
+``collect_schema_locations.py``, or it can be written by hand.
+
+You can also add command line options to the "flags" entries and can
+add the name of sub-class modules to be generated to the
+"outsubfile" entries.
+
+Comments in the directives file -- The directives file is a JSON
+file, and JSON does not support comments.  However, for use with
+``batch_generate.py``, the input directives file can contain
+comments.  Any line whose first non-whitespace characters are "//"
+is considered a comment and is discarded by ``batch_generate.py``
+before the remaining contents are parsed by the JSON parser.
+
+See the notes in this file on ``collect_schema_locations.py`` for a
+sample of the directives file.
+
+
+Options and configuration
+---------------------------
+
+Each of the long-name command line options (the ones preceded by
+"--", excluding ``--config``) can be placed in a configuration file
+and referenced with the ``--config`` command line option.  Here is a
+sample of a configuration file::
+
+    [generateds-batch]
+    verbose = true
+    command = ./generateDS.py
+    flags = -f --member-specs=dict
+    in-path = energistics/prodml/v2.0/xsd_schemas
+    out-path = OnePer3
diff --git a/utils/batch_generate.py b/utils/batch_generate.py
new file mode 100755
index 0000000..d8f955d
--- /dev/null
+++ b/utils/batch_generate.py
@@ -0,0 +1,243 @@
+#!/usr/bin/env python
+
+"""
+usage: batch_generate.py [-h] [--config CONFIG] [-c COMMAND] [--flags FLAGS]
+                         [--in-path IN_PATH] [--out-path OUT_PATH] [-v]
+                         infilename
+
+synopsis:
+  read input directives from JSON file (produced by
+  collect_schema_locations.py) and generate python modules.
+
+positional arguments:
+  infilename            input JSON file containing directives
+
+optional arguments:
+  -h, --help            show this help message and exit
+  --config CONFIG       configuration file
+  -c COMMAND, --command COMMAND
+                        command. Default is "generateDS.py"
+  --flags FLAGS         command line options for generateDS.py
+  --in-path IN_PATH     path to the directory containing the input schemas
+  --out-path OUT_PATH   path to a directory into which modules should be
+                        generated
+  -v, --verbose         Print messages during actions.
+
+examples:
+  python batch_generate.py input_directives.json
+  python batch_generate.py --config=name.config input_directives.json
+
+notes:
+  The configuration file (see --config) has the following form:
+
+        [generateds]
+        verbose = true
+        command = ./generateDS.py
+        flags = -f --member-specs=dict
+        in-path = energistics/prodml/v2.0/xsd_schemas
+        out-path = OnePer
+
+    The option names in this configuration file are the long command line
+    option names.  Options entered on the command line over-ride options
+    in this config file.
+  Flags/options for generateDS.py -- These flags are passed to
+    generateDS.py as command line options.  Precedence: (1) Flags in
+    the directives file override the --flags command line option to
+    batch_generate.py.  (2) Flags in the --flags command line option
+    to batch_generate.py override flags in the configuration file (the
+    argument to --config=).
+"""
+
+
+#
+# imports
+from __future__ import print_function
+import os
+import argparse
+import configparser
+import subprocess
+import json
+
+
+#
+# Global variables
+
+
+#
+# Private functions
+
+def dbg_msg(options, msg):
+    """Print a message if verbose is on."""
+    if options.verbose:
+        print(msg)
+
+
+def generate_one(directive, options):
+    """Generate modules for one XML schema."""
+    schema_name = directive.get('schema')
+    outfilename = directive.get('outfile')
+    outsubfilename = directive.get('outsubfile')
+    if options.in_path:
+        schema_name = os.path.join(options.in_path, schema_name)
+    modulename = outfilename.split('.')[0]
+    if options.out_path:
+        outfilename = os.path.join(options.out_path, outfilename)
+    if outsubfilename:
+        if options.out_path:
+            outsubfilename = os.path.join(options.out_path, outsubfilename)
+        outsubfilestem = outsubfilename
+        outsubfilename = '--super={} -s {}'.format(modulename, outsubfilename)
+    else:
+        outsubfilename = ""
+        outsubfilestem = outsubfilename
+    flags = directive.get('flags')
+    if not flags:
+        flags = options.flags
+    #flags = '{} {}'.format(flags, options.flags)
+    cmd = '{} {} -o {} {} {}'.format(
+        options.command,
+        flags,
+        outfilename,
+        outsubfilename,
+        schema_name,
+    )
+    dbg_msg(options, '\ncmd: {}'.format(cmd))
+    result = subprocess.run(
+        cmd,
+        stderr=subprocess.PIPE,
+        stdout=subprocess.PIPE,
+        shell=True,
+    )
+    dbg_msg(options, 'generated: {} {}'.format(outfilename, outsubfilestem))
+    if result.stderr:
+        print('errors: {}'.format(result.stderr))
+    if result.stdout:
+        print('output: {}'.format(result.stdout))
+
+
+def merge_options(options):
+    """Merge config file options and command line options.
+    Command line options over-ride config file options.
+    """
+    config = configparser.ConfigParser()
+    config.read(options.config)
+    if not config.has_section('generateds-batch'):
+        raise RuntimeError(
+            'config file missing required section "generateds-batch"')
+    section = config['generateds-batch']
+    for key in section:
+        key1 = key.replace('-', '_')
+        if not getattr(options, key1):
+            setattr(options, key1, section[key])
+
+
+def load_json_file(infile):
+    """Read file.  Strip out lines that begin with '//'."""
+    lines = []
+    for line in infile:
+        if not line.lstrip().startswith('//'):
+            lines.append(line)
+    content = ''.join(lines)
+    return content
+
+
+#
+# Exported functions
+def batch_generate(infile, options):
+    """Generate module(s) for each line in directives file."""
+    content = load_json_file(infile)
+    specification = json.loads(content)
+    directives = specification['directives']
+    for directive in directives:
+        generate_one(directive, options)
+
+
+def main():
+    description = """\
+synopsis:
+  read input directives from JSON file (produced by
+  collect_schema_locations.py) and generate python modules.
+"""
+    epilog = """\
+examples:
+  python batch_generate.py input_directives.json
+  python batch_generate.py --config=name.config input_directives.json
+
+notes:
+  The input directives file is a JSON file.  batch_generate.py will
+    run generateDS.py once for each directive in this JSON file.
+    This directives file can be produced by
+    utils/collect_schema_locations.py.
+  The configuration file (see --config) has the following form:
+
+        [generateds]
+        verbose = true
+        command = ./generateDS.py
+        flags = -f --member-specs=dict
+        in-path = energistics/prodml/v2.0/xsd_schemas
+        out-path = OnePer
+
+    The option names in this configuration file are the long command line
+    option names.  Options entered on the command line over-ride options
+    in this config file.
+  Flags/options for generateDS.py -- These flags are passed to
+    generateDS.py as command line options.  Precedence: (1) Flags in
+    the directives file override the --flags command line option to
+    batch_generate.py.  (2) Flags in the --flags command line option
+    to batch_generate.py override flags in the configuration file (the
+    argument to --config=).
+  The input directives file can contain comments.  Any line whose first
+    non-whitespace characters are "//" is considered a comment and is
+    discarded before the remaining contents are parsed by the JSON parser.
+"""
+    parser = argparse.ArgumentParser(
+        description=description,
+        epilog=epilog,
+        formatter_class=argparse.RawDescriptionHelpFormatter,
+    )
+    parser.add_argument(
+        "infilename",
+        help="input JSON file containing directives",
+    )
+    parser.add_argument(
+        "--config",
+        help="configuration file",
+    )
+    parser.add_argument(
+        "-c", "--command",
+        #default="generateDS.py",
+        help="command.  Default is \"generateDS.py\"",
+    )
+    parser.add_argument(
+        "--flags",
+        help="command line options for generateDS.py",
+    )
+    parser.add_argument(
+        "--in-path",
+        help="path to the directory containing the input schemas",
+    )
+    parser.add_argument(
+        "--out-path",
+        help="path to a directory into which modules should be generated",
+    )
+    parser.add_argument(
+        "-v", "--verbose",
+        action="store_true",
+        help="Print messages during actions.",
+    )
+    options = parser.parse_args()
+    if options.config:
+        merge_options(options)
+    if not options.command:
+        options.command = 'generateDS.py'
+    if not options.flags:
+        options.flags = ''
+    dbg_msg(options, '\noptions: {}'.format(options))
+    infile = open(options.infilename, 'r')
+    batch_generate(infile, options)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    #import ipdb; ipdb.set_trace()
+    main()
diff --git a/utils/collect_schema_locations.py b/utils/collect_schema_locations.py
new file mode 100755
index 0000000..228410d
--- /dev/null
+++ b/utils/collect_schema_locations.py
@@ -0,0 +1,155 @@
+#!/usr/bin/env python
+
+"""
+usage: collect_schema_locations.py [-h] [-f] [-v] infilename [outfilename]
+
+synopsis:
+  collect schema locations from xs:include/xs:import elements in schema.
+
+positional arguments:
+  infilename     name/location of the XML schema file to be searched
+  outfilename    output file name; if ommited stdout
+
+optional arguments:
+  -h, --help     show this help message and exit
+  -f, --force    force overwrite existing output file
+  -v, --verbose  print messages during actions.
+
+examples:
+  python collect_schema_locations.py myschema.xsd
+  python collect_schema_locations.py myschema.xsd outfile.txt
+"""
+
+
+#
+# imports
+from __future__ import print_function
+import sys
+import os
+import argparse
+import json
+from lxml import etree
+
+
+#
+# Global variables
+
+
+#
+# Private functions
+
+def dbg_msg(options, msg):
+    """Print a message if verbose is on."""
+    if options.verbose:
+        print(msg)
+
+
+def extract_locations(infile, options):
+    doc = etree.parse(infile)
+    root = doc.getroot()
+    elements = root.xpath(
+        './/xs:include',
+        namespaces=root.nsmap,
+    )
+    locations = []
+    for element in elements:
+        schema_name = element.get('schemaLocation')
+        locations.append(schema_name)
+    return locations
+
+
+def generate(locations, outfile, options):
+    directives = []
+    for location in locations:
+        schema_name = location
+        outfilename = os.path.split(schema_name)[1]
+        outfilename = os.path.splitext(outfilename)[0]
+        outfilename = '{}.py'.format(outfilename)
+        directive = {
+            'schema': schema_name,
+            'outfile': outfilename,
+            'outsubfile': '',
+            'flags': '',
+        }
+        directives.append(directive)
+    return directives
+
+
+def make_output_file(outfilename, options):
+    if os.path.exists(outfilename) and not options.force:
+        sys.exit("\noutput file exists.  Use -f/--force to over-write.\n")
+    outfile = open(outfilename, 'w')
+    return outfile
+
+
+#
+# Exported functions
+
+def extract_and_generate(infile, outfile, options):
+    locations = extract_locations(infile, options)
+    directives = generate(locations, outfile, options)
+    specification = {
+        'directives': directives,
+    }
+    json.dump(specification, outfile, indent='    ')
+
+
+def main():
+    description = """\
+synopsis:
+  collect schema locations from xs:include/xs:import elements in schema.
+"""
+    epilog = """\
+examples:
+  python collect_schema_locations.py myschema.xsd
+  python collect_schema_locations.py myschema.xsd outfile.txt
+
+notes:
+  The output directives file is a JSON file suitable for input to
+    utils/batch_generate.py.  This directives file contains one directive
+    for each module to be generated by generateDS.py.
+  You can edit this resulting JSON file, for example to add a sub-class
+    module file or flags/options for generateDS.py that are specific
+    to each directive.
+"""
+    parser = argparse.ArgumentParser(
+        description=description,
+        epilog=epilog,
+        formatter_class=argparse.RawDescriptionHelpFormatter,
+    )
+    parser.add_argument(
+        "infilename",
+        help="name/location of the XML schema file to be searched"
+    )
+    parser.add_argument(
+        "outfilename",
+        nargs="?",
+        default=None,
+        help="output file name; if ommited stdout"
+    )
+    parser.add_argument(
+        "-f", "--force",
+        action="store_true",
+        help="force overwrite existing output file",
+    )
+    parser.add_argument(
+        "-v", "--verbose",
+        action="store_true",
+        help="print messages during actions.",
+    )
+    options = parser.parse_args()
+    infile = open(options.infilename, 'r')
+    if options.outfilename:
+        outfile = make_output_file(options.outfilename, options)
+    else:
+        outfile = sys.stdout
+    extract_and_generate(infile, outfile, options)
+    infile.close()
+    if options.outfilename:
+        outfile.close()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    #import ipdb; ipdb.set_trace()
+    main()
diff --git a/utils/show_schema_hierarchy.py b/utils/show_schema_hierarchy.py
new file mode 100755
index 0000000..83afb97
--- /dev/null
+++ b/utils/show_schema_hierarchy.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python
+
+"""
+usage: show_schema_hierarchy.py [-h] [-i INDENT] [--eliminate-branch-dups]
+                                [--show-loop-references] [-v]
+                                inschema
+
+synopsis:
+  show an indented schema hierarchy of xs:include/xs:import.
+
+positional arguments:
+  inschema              The input (root) schema
+
+optional arguments:
+  -h, --help            show this help message and exit
+  -i INDENT, --indent INDENT
+                        Indent string. default: " " (4 spaces)
+  --eliminate-branch-dups
+                        Eliminate (ignore) duplicate references even when
+                        previously seen in other branches
+  --show-loop-references
+                        Show references that would cause loops
+  -v, --verbose         Print messages during actions.
+
+examples:
+  python show_schema_hierarchy.py root_schema.xsd
+"""
+
+
+#
+# imports
+from __future__ import print_function
+#import sys
+import argparse
+from lxml import etree
+
+
+#
+# Global variables
+
+
+#
+# Private functions
+
+def dbg_msg(options, msg):
+    """Print a message if verbose is on."""
+    if options.verbose:
+        print(msg)
+
+
+#
+# Exported functions
+
+
+def show_hierarchy(inschema, path, indent, namespaces, previous, options):
+    if not inschema.startswith('http') and path:
+        inschemaloc = '{}/{}'.format(path, inschema)
+    else:
+        inschemaloc = inschema
+    if inschema in previous:
+        if options.show_loop_references:
+            print('{}*loop* -- {}'.format(indent, inschemaloc))
+        #print('{} *previous* -- {}'.format(indent, previous))
+        return
+    previous.add(inschema)
+    print('{}{} -- {}'.format(indent, inschema, inschemaloc))
+    doc = etree.parse(inschemaloc)
+    root = doc.getroot()
+    elements = root.xpath('./xs:include', namespaces=namespaces)
+    elements += root.xpath('./xs:import', namespaces=namespaces)
+    indent1 = indent + options.indent
+    if inschema.startswith('http'):
+        stem = inschema.split('/')[-1]
+        ln = 0 - (len(stem) + 1)
+        path = inschema[:ln]
+    for element in elements:
+        location = element.get('schemaLocation')
+        if options.eliminate_branch_dups:
+            previous1 = previous
+        else:
+            previous1 = previous.copy()
+        show_hierarchy(location, path, indent1, namespaces, previous1, options)
+
+
+def main():
+    description = """\
+synopsis:
+  show an indented schema hierarchy of schema documents that are
+  pulled in by xs:include and xs:import.
+"""
+    epilog = """\
+examples:
+  python show_schema_hierarchy.py root_schema.xsd
+  python show_schema_hierarchy.py -v --show-loop-references root_schema.xsd
+"""
+    parser = argparse.ArgumentParser(
+        description=description,
+        epilog=epilog,
+        formatter_class=argparse.RawDescriptionHelpFormatter,
+    )
+    parser.add_argument(
+        "inschema",
+        help="the input (root) schema",
+    )
+    parser.add_argument(
+        "-i", "--indent",
+        default="    ",
+        help='indent string. default is 4 spaces',
+    )
+    parser.add_argument(
+        "--eliminate-branch-dups",
+        action="store_true",
+        help="eliminate (ignore) duplicate references even when previously "
+             "seen in other branches",
+    )
+    parser.add_argument(
+        "--show-loop-references",
+        action="store_true",
+        help="show references that would cause loops"
+    )
+    parser.add_argument(
+        "-v", "--verbose",
+        action="store_true",
+        help="print additional messages during actions.",
+    )
+    options = parser.parse_args()
+    parent = ''
+    indent = ''
+    namespaces = {'xs': 'http://www.w3.org/2001/XMLSchema'}
+    previous = set()
+    show_hierarchy(
+        options.inschema, parent, indent, namespaces, previous, options)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    #import ipdb; ipdb.set_trace()
+    main()
-- 
GitLab