Включение нескольких статей из докбука в книгу: ошибка с одинаковыми идентификаторами

Имея основной DocBook "book.xml", я хочу включить в него несколько статей DocBook, скажем, x.xml и y.xml. (Я делаю это с помощью

  <xi:include href="generated_schemata/x/x.xml"/>

Эти статьи x и y генерируются из OxygenXML и схемы документа XSD (x.xsd и y.xsd). Внутри другой схемы у меня есть одно и то же имя элемента (скажем, «A»).

docbkx жалуется (и я понимаю почему), что, хотя он пытается включить статьи x и y в book.xml для рендеринга PDF, существует несколько экземпляров идентификаторов, а именно для A:

Failed to execute goal com.agilejava.docbkx:docbkx-maven-plugin:2.0.17:generate-pdf (default) on project docbook: 
Failed to transform to fo: org.apache.fop.fo.ValidationException: Property ID "A" (found on "fo:block") previously used; ID values must be unique within a document!

Любая идея об автоматическом разделении этих экземпляров? Может быть, автоматически добавляя префикс?

(Я понимаю, я мог бы вручную изменить x.xml и y.xml, чтобы не было конфликтов, однако из-за частых изменений это источник ошибок. Или я мог бы изменить спецификацию схемы, что не вариант ).


person Walter Kuhn    schedule 28.02.2018    source источник


Ответы (3)


Вот один из рецептов от Боба Стейтона, как изменить xsl, чтобы избежать дублирования идентификаторов в выводе: http://www.sagehill.net/docbookxsl/DuplicateIDs.html#ModifyIdValues

person Eduard Tibet    schedule 02.03.2018

Не уверен, поможет ли это в вашей конкретной ситуации, но Oxygen 19.1 поддерживает XInclude 1.1, а в xi:include 1.1 есть функция, которая позволит вам изменить атрибут ID для включенного элемента:

https://www.w3.org/TR/xinclude-11/#attribute-copying

Но это будет работать только при публикации из Oxygen, а не при использовании внешней системы сборки.

person Radu Coravu    schedule 02.03.2018

Оба решения — от Эдуарда Тибета и от Раду Кораву — в комплексе работают отлично. Итак, вкратце, я описываю свое решение - все еще не идеальное, но работающее: мой мастер-файл "books.xml" использует несколько включений, таких как:

<xi:include href="generated_schemata/services/services.xml" ns3:root="one"/>
<xi:include href="generated_schemata/systems/systems.xml" ns3:root="two"/>

Оба включаемых файла были сгенерированы OxygenXML и являются документацией для схем.

моя конфигурация maven включает в себя:

<plugin>
            <groupId>com.agilejava.docbkx</groupId>
            <artifactId>docbkx-maven-plugin</artifactId>
            <version>2.0.17</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate-html</goal>
                        <goal>generate-pdf</goal>
                    </goals>
                    <phase>package</phase>
                </execution>
            </executions>
            <configuration>
                <paperType>A4</paperType>
                <xincludeSupported>true</xincludeSupported>
                <useExtensions>1</useExtensions>
                <fop1Extensions>1</fop1Extensions>
                <generatedSourceDirectory>${project.build.directory}/xinclude</generatedSourceDirectory>
                <includes>book.xml</includes>
                <foCustomization>src/docbkx/xsl/fo.xsl</foCustomization> 
                <xhtmlCustomization>src/docbkx/xsl/xhtml.xsl</xhtmlCustomization>
                <htmlCustomization>src/docbkx/xsl/xhtml.xsl </htmlCustomization>
                <chapterAutolabel>1</chapterAutolabel> 
                <sectionAutolabel>1</sectionAutolabel> 
                <sectionAutolabelMaxDepth>5</sectionAutolabelMaxDepth>                 <sectionLabelIncludesComponentLabel>true</sectionLabelIncludesComponentLabel>
                <postProcess>
                    <copy todir="${env.GENQ_HOME}/doc/extra/html/generated_schemata/services/img">
                        <fileset dir="src/docbkx/generated_schemata/services/img/">
                            <include name="**/*.css"/>
                            <include name="**/*.js"/>
                            <include name="**/*.png"/>
                            <include name="**/*.gif"/>
                            <include name="**/*.jpg"/>
                            <include name="**/*.jpeg"/>
                        </fileset>
                    </copy>
                    <copy todir="${env.GENQ_HOME}/doc/extra/html/generated_schemata/systems/img">
                        <fileset dir="src/docbkx/generated_schemata/systems/img/">
                            <include name="**/*.css"/>
                            <include name="**/*.js"/>
                            <include name="**/*.png"/>
                            <include name="**/*.gif"/>
                            <include name="**/*.jpg"/>
                            <include name="**/*.jpeg"/>
                        </fileset>
                    </copy>                     
                </postProcess>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>net.sf.docbook</groupId>
                    <artifactId>docbook-xml</artifactId>
                    <version>5.1b4-all</version>
                    <classifier>resources</classifier>
                    <type>zip</type>
                    <scope>runtime</scope>
                </dependency>
                <dependency>
                    <groupId>net.sf.offo</groupId>
                    <artifactId>fop-hyph</artifactId>
                    <version>2.0</version>
                </dependency>
            </dependencies>
        </plugin>

и, наконец, дополнительный XSL состоит из:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:fo="http://docbook.org/ns/docbook">
<!-- use the default xslt from docbkx -->
<xsl:import href="urn:docbkx:stylesheet"/>
<!-- change the way, the TOC is done, cf. http://www.sagehill.net/docbookxsl/TOCcontrol.html -->
<xsl:param name="generate.toc" select="'book toc'"/>
<xsl:param name="fop1.extensions" select="1"/>

<xsl:attribute-set name="monospace.verbatim.properties">
    <xsl:attribute name="wrap-option">wrap</xsl:attribute>
    <xsl:attribute name="hyphenation-character">\</xsl:attribute>
    <xsl:attribute name="font-family">Courier</xsl:attribute>
    <xsl:attribute name="font-size">9pt</xsl:attribute>
    <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
</xsl:attribute-set>

<xsl:template name="object.id">
    <xsl:param name="object" select="."/>
    <xsl:variable name="id" select="@id"/>
    <xsl:variable name="xid" select="@xml:id"/>
    <xsl:variable name="preceding.id"
                  select="count(preceding::*[@id = $id])"/>
    <xsl:variable name="preceding.xid"
                  select="count(preceding::*[@xml:id = $xid])"/>
    <xsl:choose>
        <xsl:when test="$object/@id and $preceding.id != 0">
            <xsl:value-of select="concat($object/@id, $preceding.id)"/>
        </xsl:when>
        <xsl:when test="$object/@id">
            <xsl:value-of select="$object/@id"/>
        </xsl:when>
        <xsl:when test="$object/@xml:id and $preceding.xid != 0">
            <xsl:value-of select="concat($object/@xml:id, $preceding.xid)"/>
        </xsl:when>
        <xsl:when test="$object/@xml:id">
            <xsl:value-of select="$object/@xml:id"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="generate-id($object)"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="table">
    <fo:table-and-caption>
        <fo:table-caption>
            <xsl:apply-templates select="caption"/>
        </fo:table-caption>
        <xsl:apply-templates select="tbody"/>
    </fo:table-and-caption>
</xsl:template>

<xsl:template match="caption">
    <fo:block>
        <xsl:apply-templates/>
    </fo:block>
</xsl:template>

<xsl:template match="tbody">
    <fo:table space-before="0.5em" space-after="0.5em" table-layout="fixed">
        <fo:table-header>
            <xsl:apply-templates select="tr[1]"/>
        </fo:table-header>
        <fo:table-body>
            <xsl:apply-templates select="tr[position() &gt; 1]"/>
        </fo:table-body>
    </fo:table>
</xsl:template>

</xsl:stylesheet>

Надеюсь, кому-то это может пригодиться.

Есть предложения по улучшению?

person Walter Kuhn    schedule 06.03.2018