It looks like including an <output> element in a <module> to specify an
XSLT <transform> might be a clean way to transform xml:id values to make
them unique. I see that <transform> elements are not handled in the current
implementation
<https://github.com/docbook/xslt10-stylesheets/blob/master/xsl/assembly/assemble.xsl#L746>
of DocBook assembly processing.

Am I understanding <output> and <transform> in a way that's consistent with
their design <https://tdg.docbook.org/tdg/5.1/ch06.html#transformations>?

I'm asking because I'm considering a proposed implementation of
<transform>. If there's a better way to make reused module IDs unique, I'd
prefer to use that. But maybe implementing transform this way would be
generally helpful?

More context:

I am trying to construct a DocBook 5.1 book with a reused module. The
content in the module is required in more than one place in the book and I
don't want to rely on cross-references to a single copy of the content.
That would disrupt the reader's context in this large document.

Reusing a module in the same structure works just fine until the referenced
topic content includes an xml:id value. Then the resulting DocBook book is
invalid because of duplicate IDs.

I see that Bob Stayton's excellent DocBook XSL: The Complete Guide covers
making xml:id values unique in modular content using XInclude
<http://www.sagehill.net/docbookxsl/DuplicateIDs.html#ModifyIdValues>. I'm
using pure DocBook <assembly> for my books and I don't want to add
XIncludes to my processing chain.

Here's an example of the DocBook <assembly> I want to use:

<?xml version="1.0" encoding="UTF-8"?>
<assembly version="5.1">
  <resources xml:id="myResources">
    ...
  </resources>
  <structure renderas="book" xml:id="myGuide">

    <module renderas="chapter" resourceref="myTopLevelSectionIntro">

      <module renderas="section" resourceref="myTopicOne" />

      <module renderas="section" resourceref="myTopicOne">
        <merge><title>A repeated topic</title></merge>
        <!-- The output element transforms the resourceref topic as
             defined by the named transform element. -->
        <output transform="makeModuleIdValuesUnique"/>
      </module>

    </module>
  </structure>
  <transforms>
    <!-- The XSLT in this transform copies all nodes, and also prepends
         a unique value to each of the xml:id values it copies.  -->
    <transform href="../utilities/make-module-id-values-unique.xsl"
               name="makeModuleIdValuesUnique"/>
  </transforms>
</assembly>

Thanks for your help!

Peter

Reply via email to