【发布时间】: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.docbook 和source-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文件)。工具链可以包含实际文档工具之前的预处理(或者如果需要,可以在之后)。目标文件应进行上述替换。通过基于标记的语法,我的意思是类似于“
”,这是正确的 XML。抱歉不清楚。good ADJ SUPL