【问题标题】:How to extend XSD scheme for supporting SVG?如何扩展 XSD 方案以支持 SVG?
【发布时间】:2017-11-15 23:01:44
【问题描述】:

我尝试扩展ISOSTS XSD 方案以支持 SVG 图像标签。 我找到了XSD scheme for SVG,并把它放在了ISOSTS.xsd 附近。 现在我尝试扩展ISOSTS.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:mml="http://www.w3.org/1998/Math/MathML"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tbx="urn:iso:std:iso:30042:ed-1"
        xmlns:xlink="http://www.w3.org/1999/xlink"

<!-- my line -->   
        xmlns:svg="http://www.w3.org/2000/svg"

        elementFormDefault="qualified">
      <xs:import namespace="http://www.w3.org/1998/Math/MathML" 
                 schemaLocation="ncbi-mathml2/mathml2.xsd"/>
      <xs:import namespace="http://www.w3.org/1999/xlink" 
                 schemaLocation="xlink.xsd"/>
      <!-- XSD import of namespace http://www.w3.org/2001/XMLSchema-instance suppressed (not necessary) -->
      <xs:import namespace="http://www.w3.org/XML/1998/namespace" 
                 schemaLocation="xml.xsd"/>
      <xs:import namespace="urn:iso:std:iso:30042:ed-1" 
                 schemaLocation="tbx.xsd"/>

<!-- my line -->   
      <xs:import namespace="http://www.w3.org/2000/svg" 
                 schemaLocation="SVG.xsd"/>

....
<xs:element name="p">
  <xs:complexType mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
<!-- my line -->   <xs:element ref="svg:svg"/>
                   <xs:element ref="email"/>
....

但是尝试加载方案时出现错误:

    from lxml.etree import parse, XMLSchema

    schema_file = open(self._schema_filename)

    schema_doc = parse(schema_file)
    schema_file.close()

    self._xmlschema = XMLSchema(schema_doc)  # Error

错误信息:

文件“src/lxml/xmlschema.pxi”,第 87 行,在 lxml.etree.XMLSchema.init (src/lxml/lxml.etree.c:197819)

lxml.etree.XMLSchemaParseError: 元素“{http://www.w3.org/2001/XMLSchema}元素”,属性“ref”:不允许从此模式引用命名空间“http://www.w3.org/2000/svg”中的组件,因为导入语句未指示。 , 第 4664 行

怎么了?

【问题讨论】:

    标签: python xml svg xsd xsd-validation


    【解决方案1】:

    消息对我来说似乎很清楚,我不确定您不理解其中的哪一部分。您的架构文档为各种命名空间(mathml、xlink、xml 等)导入架构组件,但它没有尝试为 SVG 导入架构,并且错误消息告诉您。

    【讨论】:

    • 实际上,OP 确实导入了 SVG 模式。它有点隐藏在 XSD 提取物中,但它就在那里。我进行了编辑以使其更加突出。
    【解决方案2】:

    我复制了您的三个修改(为 SVG 命名空间声明命名空间绑定、导入 SVG 命名空间和引用 svg:svg 元素),但没有从 Xerces 或 Saxon EE 得到错误。

    所以在我看来,你做的一切都是对的。

    错误消息表明您的 XSD 验证器没有进行导入。

    如果我必须猜测(我想我必须猜测,因为虽然您已经对问题给出了非常简洁的陈述,但我们没有可重现的错误),您的验证器正在查看临时版本的架构文档,其中对 svg:svg 的引用已添加到 p 的内容模型中,但 xs:import 语句尚未添加到架构文档的开头。

    您的 Python 字节码可能已过时,需要重新编译您的 Python? (纯属猜想;我不知道lxml在编译时生成了多少架构信息,在运行时又生成了多少。)

    【讨论】:

      【解决方案3】:

      使用 SVG 的下一个 XSD 架构解决了问题:https://github.com/dumistoklus/svg-xsd-schema

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-12
        • 2011-02-24
        • 2012-06-13
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        相关资源
        最近更新 更多