展开默认(dita)属性

时间:2016-01-20 08:10:28

标签: python libxml2 dita

我的python libxml2以不同的方式处理具有默认属性的文件,具体取决于我想知道的内容。例如,使用DITA DTD(该软件包可以在www.dita-ot.org下载):

import libxml2
import libxsltmod

s = """<!DOCTYPE map PUBLIC "-//OASIS//DTD XDITA Map//EN"
"file://.../dita-ot-2.2.1/plugins/org.oasis-open.dita.v1
_2/dtd/technicalContent/dtd/map.dtd">

<map title="Empty map">
</map>"""

libxml2.substituteEntitiesDefault(1)
xmldoc = libxml2.parseDoc(s)
print xmldoc

输出符合要求:

<?xml version="1.0"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD XDITA Map//EN"
"file://.../dita-ot-2.2.1/plugins/org.oasis-open.dita.v1
_2/dtd/technicalContent/dtd/map.dtd">
<map xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/"
  title="Empty map" ditaarch:DITAArchVersion="1.2" domains="(topic delay-d)
  (map mapgroup-d)                           (topic indexing-d)
  (map glossref-d)                          (topic hi-d)
  (topic ut-d)                           (topic hazard-d)
  (topic abbrev-d)                          (topic pr-d)
  (topic sw-d)                          (topic ui-d)
  " class="- map/map ">
</map>

但如果我评论import libxsltmod,结果是:

<?xml version="1.0"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD XDITA Map//EN"
"file://.../dita-ot-2.2.1/plugins/org.oasis-open.dita.v
1_2/dtd/technicalContent/dtd/map.dtd">
<map title="Empty map">
</map>

因此,libxsltmod会激活默认属性扩展。你能建议一下,以及如何通过python激活这个功能吗?

2 个答案:

答案 0 :(得分:2)

我不知道 libxsltmod 如何全局启用此设置,但通常情况下,DTD默认属性会随parser option XML_PARSE_DTDATTR一起添加。使用readDoc代替parseDoc来提供解析器选项:

xmldoc = libxml2.readDoc(s, None, None, libxml2.XML_PARSE_DTDATTR)

或者,如果您还想替换实体:

flags = libxml2.XML_PARSE_NOENT | libxml2.XML_PARSE_DTDATTR
xmldoc = libxml2.readDoc(s, None, None, flags)

答案 1 :(得分:1)

我已经接受了@nwellnhof的答复,但也想发表我的调查。

initlibxsltmod模块的初始化函数libxslt设置全局变量:

xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;

我没有发现从libxml2 Python / C绑定代码访问此变量的任何可能性,但我发现此变量用于初始化默认的解析器上下文&#39;和可以手动创建和使用解析器上下文:

ctxt = libxml2.createDocParserCtxt(s)
opts = libxml2.XML_PARSE_NOENT | libxml2.XML_PARSE_DTDATTR
ctxt.ctxtUseOptions(opts)
ctxt.parseDocument()
xmldoc = ctxt.doc()
del ctxt

Python / C函数readDoc以这种方式执行(创建上下文,设置选项,解析)。手动上下文创建很冗长,但在某些情况下可能是必要的。