2

I'm following the lxml validation documentation to build a class that validates a given XML string against the Math ML 3.0 schema. Here's the class:

class XMLSchema(object):

    def __init__(self, path_to_xsd_file):
        with open(path_to_xsd_file) as f:
            xmlschema_doc = etree.parse(f)
        self.xmlschema = etree.XMLSchema(xmlschema_doc)

    def validate(self, well_formed_xml_string):
        """Validates a well-formed XML string against an XML schema.

        Returns True if xml_string is valid, False if not.

        """
        xml = etree.parse(StringIO(well_formed_xml_string))
        return self.xmlschema.validate(xml)

Instantiating it produces the following:

>>> x = XMLSchema('mathml3.xsd')
Traceback (most recent call last):
...
lxml.etree.XMLSchemaParseError: complex type 
'annotation-xml.model': The content model is not determinist., line 42

How do I fix this?

4

1 に答える 1

6

うーん、私が試したxsdバリデーターは、非決定論的であるとは言いませんでした(ただし、lxmlは使用しませんでした)関連するコードは

  <xs:complexType name="annotation-xml.model">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
         <xs:group ref="m:MathExpression"/>
         <xs:group ref="m:anyElement"/>
      </xs:choice>
   </xs:complexType>
   <xs:group name="anyElement">
      <xs:choice>
         <xs:any namespace="##other" processContents="skip"/>
         <xs:any namespace="##local" processContents="skip"/>
      </xs:choice>
   </xs:group>

これは、annotation-xml は mathml やその他のものを取ることができ、その他のものは他の名前空間 (##other) にあるものか、名前空間にないもの (##local) であると言うべきです。

これらの選択肢のどれが非決定論的であるかはわかりませんが、名前空間化されていない注釈が実際に必要ない場合は、##local 句を削除するなど、単純化を試みることができます。

うまくいった場合 (またはそうでない場合) は、www-math@w3.org リストで私に ping を送信していただけますか? 'このフォーラムをフォローするのではなく、mathml に関する Google アラートを拾っただけです :-)


アップデート

MathML3 第 2 版の更新の一環として、 libxmlで受け入れられるように、XSD バージョンのコンテンツ モデルを書き直しました。古いスキーマに問題はありませんでしたが、それではユーザーの役に立たないため、変更した方がよいように思われました。

于 2012-01-19T11:59:53.240 に答える