从xml文件填充docbook表 问题:
我正在寻找从xml文件填充docbook表的合理方法。目标是使docbook文件包含对所需数据的某种最小引用。当docbook文件被处理到最终发布时,应该用从xml文件检索的数据替换该引用 具体例子 下面是进一步说明这一点的具体示例。这是非常详细的,因为我第一次尝试问这个问题太模糊了 源文档.docbook从xml文件填充docbook表 问题:,xml,xslt,populate,docbook,Xml,Xslt,Populate,Docbook,我正在寻找从xml文件填充docbook表的合理方法。目标是使docbook文件包含对所需数据的某种最小引用。当docbook文件被处理到最终发布时,应该用从xml文件检索的数据替换该引用 具体例子 下面是进一步说明这一点的具体示例。这是非常详细的,因为我第一次尝试问这个问题太模糊了 源文档.docbook <?xml version="1.0" encoding="utf-8"?> <article xmlns="http://docbook.org/ns/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>
<phrase role="populateme"><phrase>ref</phrase><phrase>ref2</phrase></phrase>
上述方法产生的效果更好
,而不是goodADJ COMP
<phrase role="populateme">
<phrase>good</phrase>
<phrase>ADJ SUPL</phrase>
</phrase>
上面的“语法”非常麻烦,但我还不能认为这是有效的docbook
关于解决问题的初步思考
XInclude标签
- 优点:xml技术
- 缺点:xpointer的支持不好,如果可能的话,解决方案可能会很麻烦
- 优点:xml技术
- 缺点:xslt非常混乱,而且这可能无法用xslt实现
- 优点:可能是实现这一目标的最简单解决方案
- 缺点:无法通过xml自身的机制实现这一点
欢迎任何关于我应该采取哪种方式以及为什么这样做的意见。以及完整的代码示例等。这里是一个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>
样式表在源数据库.xml中执行查找。将其应用于源文档.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)
我想你正在寻找这样的东西。我说得对吗?是否将“xml文件”作为流程的输入,“docbook文件”作为所需的输出?什么是“目标文件”?什么是“基于标记的语法?”请澄清。@mzjn“docbook文件”和“xml文件”是“源”文件。它们应该通过从makefile调用的工具链(目前的xsltproc和fop)处理后生成“目标文档”(在我的情况下是pdf文件)。工具链可以包含实际docbook工具之前的预处理(或者如果需要,在之后)。目标文档应该有上述替换。基于标记的语法指的是类似“goodADJ SUPL”的东西,这是正确的XML。很抱歉不清楚。是的,这就是我要找的。我希望有某种方法可以合理优雅地实现这一点。谢谢。
<?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>
<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>