2012-01-10 4 views
1

Вопрос

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

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

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

источник-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> 

источник-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 и фат, но другие могут быть предложены.)

publication.pdf

Normal DocBook подготовлены публикации PDF со следующими заменами:

<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?

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

  • плюсы: возможно простое решение для достижения этой цели?
  • минусы: невозможность достичь этого с собственными механизмами XML в

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

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

+0

Является ли «xml-файл» входным для процесса и «файл docbook» желаемым результатом? Что такое «целевой документ»? Что такое «синтаксис на основе тегов?» Пожалуйста, уточните: – mzjn

+0

@mzjn «файл docbook» и «xml-файл» являются «исходными» файлами. Они должны создавать «целевой документ» (файл pdf в моем случае) после обработки цепочки инструментов (xsltproc и fop в данный момент), вызванный из makefile. Инструментальная цепочка может содержать предварительную обработку перед действительными инструментами docbook (или после этого, если вам нужно). Целевой документ должен иметь выше замещений. По синтаксису на основе тегов я имею в виду что-то вроде « good ADJ SUPL ", который является надлежащим XML. Извините за то, что он не ясен. – ojs

ответ

2

Вот 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> 

Таблица стилей выполняет поиск в источник-database.xml. Когда он применяется к -источника 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> 

Этот документ (назовем его publication.docbook), то вы можете включить в PDF (публикации. pdf).

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

+0

Да, это то, что я искал. Я надеялся, что есть способ сделать это разумно элегантно. Спасибо. – ojs

Смежные вопросы