Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从xml文件填充docbook表 问题:_Xml_Xslt_Populate_Docbook - Fatal编程技术网

从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文件填充docbook表的合理方法。目标是使docbook文件包含对所需数据的某种最小引用。当docbook文件被处理到最终发布时,应该用从xml文件检索的数据替换该引用

具体例子 下面是进一步说明这一点的具体示例。这是非常详细的,因为我第一次尝试问这个问题太模糊了

源文档.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的支持不好,如果可能的话,解决方案可能会很麻烦
xslt预处理转换

  • 优点:xml技术
  • 缺点:xslt非常混乱,而且这可能无法用xslt实现
python预处理脚本

  • 优点:可能是实现这一目标的最简单解决方案
  • 缺点:无法通过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>