Заполнение таблицы документации из XML-файла - PullRequest
1 голос
/ 10 января 2012

Вопрос

Я ищу разумный способ для заполнения таблиц docbook из XML-файлов.Цель состоит в том, чтобы иметь файл документации, который содержит некоторую минимальную ссылку на необходимые данные.Когда файл документации обрабатывается для окончательной публикации, эту ссылку следует заменить данными, извлеченными из файла XML.

Конкретный пример

Ниже приведен конкретный пример, чтобы проиллюстрировать это далее.Это довольно подробно, потому что моя первая попытка задать этот вопрос была слишком расплывчатой.

source-document.docbook

<?xml version="1.0" encoding="utf-8"?>
<article xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="en">
    <info><title/></info>
    <table><title/><tgroup cols="2"><tbody>
        <row>
            <entry>good in comparative</entry>
            <entry>
                <phrase role="populateme">
                    <phrase>good</phrase>
                    <phrase>ADJ COMP</phrase>
                </phrase>
            </entry>
        </row>
        <row>
            <entry>good in superlative</entry>
            <entry>
                <phrase role="populateme">
                    <phrase>good</phrase>
                    <phrase>ADJ SUPL</phrase>
                </phrase>
            </entry>
        </row>
    </tbody></tgroup></table>
</article>

source-database.xml

<?xml version="1.0" encoding="utf-8"?>
<database>
    <row>
        <cell>good</cell>
        <cell>ADJ POST</cell>
        <cell>good</cell>
    </row>
    <row>
        <cell>better</cell>
        <cell>ADJ COMP</cell>
        <cell>good</cell>
    </row>
    <row>
        <cell>best</cell>
        <cell>ADJ SUPL</cell>
        <cell>good</cell>
    </row>
</database>

обработка

Makefile содержит рецепт для получения publication.pdf из source-document.docbook и source-database.xml.(В настоящее время я выбираю xsltproc и fop, но можно предложить и другие)*

<phrase role="populateme">
    <phrase>good</phrase>
    <phrase>ADJ COMP</phrase>
</phrase>

выше производит better вместо goodADJ COMP.

<phrase role="populateme">
    <phrase>good</phrase>
    <phrase>ADJ SUPL</phrase>
</phrase>

выше производит best вместо goodADJ SUPL.

последнее замечание

<phrase role="populateme"><phrase>ref</phrase><phrase>ref2</phrase></phrase>

Выше «синтаксис» очень громоздок, но я пока не могу придумать ничего лучшего, чем действительный docbook.

Предварительные мысли о решении

Теги XInclude

  • плюсы: техника xml
  • минусы: плохая поддержка xpointer, решение, вероятно, будет громоздким, если это вообще возможно

преобразование предварительной обработки xslt

  • плюсы: метод xml
  • минусы: xslt довольно запутанный, к тому же это невозможно сделать с помощью xslt?

скрипт предварительной обработки python

  • плюсы: возможно, siСамое лучшее решение для достижения этого?
  • минусы: невозможность достичь этого с помощью собственных механизмов xml

что-то другое?

Любой вклад, о которомкак я должен принять это и почему можно только приветствовать.А также полные примеры кода и т. Д.

1 Ответ

2 голосов
/ 12 января 2012

Вот таблица стилей XSLT:

<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:db="http://docbook.org/ns/docbook"
            exclude-result-prefixes="db"
            version="1.0">

  <xsl:variable name="database" select="document('source-database.xml')"/>

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

  <xsl:template match="db:entry[db:phrase[@role='populateme']]">

    <xsl:element name="entry" namespace="http://docbook.org/ns/docbook">
      <xsl:value-of select="$database//row[cell[3] = current()/db:phrase/db:phrase[1]
                            and cell[2] = current()/db:phrase/db:phrase[2]]/cell[1]"/>
    </xsl:element>

  </xsl:template>
</xsl:stylesheet>

Таблица стилей выполняет поиск в source-database.xml .Когда он применяется к source-document.docbook , создается следующий документ с результатами:

<article xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="en">
  <info><title/></info>
  <table><title/>
  <tgroup cols="2">
    <tbody>

      <row>
        <entry>good in comparative</entry>
        <entry>better</entry>
      </row>

      <row>
        <entry>good in superlative</entry>
        <entry>best</entry>
      </row>

    </tbody>
  </tgroup>
  </table>
</article>

Этот документ (назовем его publishing.docbook )затем может превратиться в PDF ( publishing.pdf ).

Я думаю, что-то вроде этого вы ищете.Я прав?

...