Как выполнить многопроходную обработку в Docbook

Я новичок в docbook, но не могу найти достойный способ сделать кратное преобразование за один шаг; необходима некоторая постобработка результата. Я хотел бы добавить раздел с заголовком и некоторый текст в структуру xml docbook на первом этапе, а затем сгенерировать преобразование, чтобы получить мой файл PDF на втором этапе.

простойXMLtoXML.xsl

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xlink="http://www.w3.org/1999/xlink" 
xmlns:d="http://docbook.org/ns/docbook" 
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">

    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="node(  ) | @*"> 
        <xsl:copy>  
            <xsl:apply-templates select="@* | node(  )"/>  
        </xsl:copy>
    </xsl:template>         
    <xsl:template match="d:chapter">

        <xsl:copy> 
            <xsl:copy-of select="@*"/>
            <xsl:copy-of select="*"/>
            <xsl:element name="section" xmlns="http://docbook.org/ns/docbook">
                        <d:title> Cette section a été ajoutée </d:title>
                        <d:para> ce texte a été ajouté </d:para>
            </xsl:element>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Мой файл XSI для создания PDF

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:fo="http://www.w3.org/1999/XSL/Format"
        xmlns:set="http://exslt.org/sets"
        xmlns:saxon="http://icl.com/saxon"
        xmlns:exsl="http://exslt.org/common"
        extension-element-prefixes="exsl"
        xmlns:d="http://docbook.org/ns/docbook"
        exclude-result-prefixes="d"
        version="1.0">

    <?cco_xsltype addon="DocBook5.0" toolchain="DocBook_to_PDF_FOP"?>
    <?cco_xsltype addon="DocBook5.0" toolchain="DocBook_to_PS_FOP"?>
<!-- Import standard -->
<xsl:import href="simpleXMLtoXML.xsl"/>
<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/profile-docbook.xsl"/>

<!-- DocBook XSL Parameters -->


<xsl:param select="1" name="fop1.extensions"/>

<xsl:param name="paper.type">A4</xsl:param>


<xsl:template match="book">

<xsl:variable name="content"> 
        <xsl:apply-imports/> 
        </xsl:variable> 

<xsl:apply-templates select="exsl:node-set($content)"/>     
</xsl:template>

</xsl:stylesheet>

Спасибо за любую помощь.


person noussa    schedule 20.04.2020    source источник


Ответы (1)


Я бы подумал, что использование режима, например.

<xsl:template match="node() | @*" mode="change"> 
    <xsl:copy>  
        <xsl:apply-templates select="@* | node()" mode="change"/>  
    </xsl:copy>
</xsl:template>         
<xsl:template match="d:chapter" mode="change">

    <xsl:copy> 
        <xsl:copy-of select="@*"/>
        <xsl:copy-of select="*"/>
        <xsl:element name="section" xmlns="http://docbook.org/ns/docbook">
                    <d:title> Cette section a été ajoutée </d:title>
                    <d:para> ce texte a été ajouté </d:para>
        </xsl:element>
    </xsl:copy>
</xsl:template>




<xsl:variable name="content"> 
        <xsl:apply-templates mode="change"/> 
</xsl:variable>

<xsl:template match="/">
   <xsl:apply-templates select="exsl:node-set($content)/node()"/>     
</xsl:template>

это чистый способ разделения шагов.

person Martin Honnen    schedule 20.04.2020
comment
Спасибо за вашу помощь, но я получил это сообщение об ошибке Раздел элемента в пространстве имен 'docbook.org/ns/docbook' встречается в главе, но ни один шаблон не соответствует. Заголовок элемента в пространстве имен 'docbook.org/ns/docbook' обнаружен в разделе, но шаблон не соответствует. Элемент para в пространстве имен 'docbook.org/ns/docbook' обнаружен в разделе, но нет совпадений с шаблоном. --- Преобразование FOP --- Пн, 20 апреля 2020 г., 10:52:42 [ФАТАЛЬНАЯ ОШИБКА] - org.apache.fop.fo.ValidationException: fo:block не является допустимым дочерним элементом fo:root! (См. позицию 1:-1) - person noussa; 20.04.2020
comment
@noussa, определяет ли DocBook элементы с именами section или title? Или вы пытались расширить существующие элементы, определенные в DocBook, своими элементами section и/или title? Используемая вами таблица стилей profile-docbook.xsl объявляет шаблоны для элементов section и/или title для сопоставления их с элементами XSL-FO? - person Martin Honnen; 20.04.2020
comment
Да, я использую существующие элементы в DocBook и определяю шаблоны profile-docbook.xsl для раздела и заголовка. - person noussa; 20.04.2020
comment
@noussa, глядя на импортированный profile-docbook.xsl, кажется, что попытка <xsl:apply-templates select="exsl:node-set($content)/*" mode="process.root"/> вместо <xsl:apply-templates select="exsl:node-set($content)/node()"/> может сработать. Но вы, возможно, захотите подождать кого-то с опытом работы с Docbook, я уверен, что мое предложение не предназначено для использования. Или придерживайтесь двух разных этапов обработки, объединенных в цепочку с помощью Ant, XProc или какой-либо оболочки. - person Martin Honnen; 20.04.2020