【问题标题】:Populating docbook table from xml file从 xml 文件填充 docbook 表
【发布时间】:2012-01-10 13:00:39
【问题描述】:

问题

我正在寻找从 xml 文件填充文档表的合理方法。目标是拥有包含对所需数据的某种最小引用的 docbook 文件。当 docbook 文件被处理为最终发布时,此引用应替换为从 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 包含从source-document.docbooksource-database.xml 生成publication.pdf 的配方。 (目前我选择的工具是 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>

“语法”之上非常繁琐,但我想不出比这更有效的文档了。

关于解决方案的初步想法

X包含标签

  • 优点:xml 技术
  • 缺点:对 xpointer 的支持不好,如果可能的话,解决方案可能会很麻烦

xslt 预处理转换

  • 优点:xml 技术
  • 缺点:xslt 相当混乱,而且这可能无法通过 xslt 实现?

python 预处理脚本

  • 优点:可能是实现这一目标的最简单解决方案?
  • 缺点:使用 xml 自己的机制无法实现这一点

其他的?

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

【问题讨论】:

  • “xml 文件”是流程的输入,而“docbook 文件”是所需的输出吗?什么是“目标文件”?什么是“基于标签的语法?请澄清。
  • @mzjn "docbook file" 和 "xml file" 是“源”文件。他们应该在从makefile调用的槽工具链(目前是xsltproc和fop)处理后生成“目标文档”(在我的例子中是pdf文件)。工具链可以包含实际文档工具之前的预处理(或者如果需要,可以在之后)。目标文件应进行上述替换。通过基于标记的语法,我的意思是类似于“goodADJ SUPL”,这是正确的 XML。抱歉不清楚。

标签: xml xslt populate docbook


【解决方案1】:

这是一个 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)。

我认为您正在寻找类似的东西。我说的对吗?

【讨论】:

  • 是的,这就是我要找的。我希望有某种方法可以相当优雅地实现这一目标。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多