代码之家  ›  专栏  ›  技术社区  ›  olpa

展开默认(dita)属性

  •  1
  • olpa  · 技术社区  · 9 年前

    我的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 回复  |  直到 9 年前
        1
  •  2
  •   nwellnhof    9 年前

    我不知道怎么做 库xsltmod 全局启用此设置,但通常情况下,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)
    
        2
  •  1
  •   olpa    9 年前

    我接受了@nwellnhof的回答,但也希望公布我的调查结果。

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

    xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
    

    我没有找到任何从 libxml2 Python/C绑定代码,但我发现这个变量用于初始化默认的“解析器上下文”,并且可以手动创建和使用解析器语境:

    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 以这种方式执行示例(创建上下文、设置选项、解析)。手动创建上下文是冗长的,但在某些情况下可能是必要的。