1

我正在制作一个 SCons 文件来构建 Docbook 文档。为了跟踪依赖关系,我想要某种方法将目录文件查找解析为文件的绝对路径。

所以说我有一点 Docbook XML:

<book xmlns="http://docbook.org/ns/docbook"
      xmlns:xi="http://www.w3.org/2001/XInclude">

  <info> 
    <title>Docbook example document</title>

    <xi:include href="file:///common/logo.xml"
        xpointer="logo"/>

  </info>
  <xi:include href="chap1/chap1.xml"/>
  <xi:include href="chap2/chap2.xml"/>
  <xi:include href="chap3/chap3.xml"/>
  <xi:include href="chap4/chap4.xml"/>

</book>

和一个 catalog.xml 文件:

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

  <rewriteURI
    uriStartString="file:///stylesheet/"
    rewritePrefix="file:///home/kst/svn/TOOLS/Docbook/stylesheet/" />

  <rewriteURI
    uriStartString="file:///common/"
    rewritePrefix="file:///home/kst/svn/TOOLS/Docbook/common/" />


  <nextCatalog  catalog="/etc/xml/catalog" />

</catalog>

使用 lxml 获取 xinclude href 字符串没有问题,但我被困在那里。我需要某种方法从目录文件中获取 file:///common/logo.xml 解析为的绝对文件名(在本例中为 /home/kst/svn/TOOLS/Docbook/common/logo.xml)。它需要是某种 Python 代码,这样我就可以在我的 SConstruct 文件中使用它而不会太麻烦。

任何帮助表示赞赏。

4

1 回答 1

0

Lxml 使用来自libxml2的目录支持。使用环境变量XML_CATALOG_FILES来提供目录列表(您也可以从 python 设置它,使用os.environ),或者,如果这个变量不存在,它检查是否存在/etc/xml/catalog(不能在 Windows 上使用这个当然)。

另一种方法是使用自定义 URI 解析器。您可以在lxml 文档中找到更多信息

编辑:显然,问题不在于实际的 xinclude 处理,它有效,而是关于“查询”目录的方法,或者询问将用于包含的实际文件名。

Lxml(至少目前)没有 API 可以做到这一点。但是,底层的 libxml2 库确实支持这一点,并且“原始” libxml2 python 绑定允许您执行此操作(虽然缺少简单的文档,但是 libxml2 帮助的源代码中的文档字符串)。所以,虽然这个模块不如 lxml 好用,但它似乎是你最好的选择。似乎有效的示例:

>>> import libxml2
>>> libxml2.loadCatalog('catalog.xml')
>>> print libxml2.catalogResolveURI('file:///common/logo.xml')
file:///home/kst/svn/TOOLS/Docbook/common/logo.xml
于 2011-08-29T11:28:57.790 回答