从xml文件填充docbook表

时间:2012-01-10 13:00:39

标签: xml xslt populate docbook

问题

我正在寻找合理的方法从xml文件填充docbook表。目标是拥有docbook文件,其中包含对所需数据的某种最小参考。将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.pdfsource-document.docbook生成source-database.xml的配方。 (目前我选择的工具是xsltproc和fop,但可以推荐其他工具。)

publication.pdf

正常的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可能无法实现这一点吗?

python预处理脚本

  • 专业人士:可能是最简单的解决方案吗?
  • 缺点:无法通过xml自己的机制实现这一目标

其他什么?

关于我应该采取哪种方式以及为什么欢迎的任何输入。以及完整的代码示例等。

1 个答案:

答案 0 :(得分: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>

样式表在 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>

这个文件(我们称之为 publication.docbook )然后你可以变成一个PDF( publication.pdf )。

我认为你正在寻找这样的东西。我是对的吗?

相关问题