我如何要求元素在 XSD 架构中具有一组属性或另一组属性?

Eli*_*ght 2 python xml validation schema lxml

我正在处理一个 XML 文档,其中标签必须具有一组属性或另一组属性。例如,它需要看起来像<tag foo="hello" bar="kitty" /><tag spam="goodbye" eggs="world" />例如

<root>
    <tag foo="hello" bar="kitty" />
    <tag spam="goodbye" eggs="world" />
</root>
Run Code Online (Sandbox Code Playgroud)

所以我有一个 XSD 架构,我使用该xs:choice元素在两个不同的属性组之间进行选择:

<xsi:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="tag">
                    <xs:choice>
                        <xs:complexType>
                            <xs:attribute name="foo" type="xs:string" use="required" />
                            <xs:attribute name="bar" type="xs:string" use="required" />
                        </xs:complexType>
                        <xs:complexType>
                            <xs:attribute name="spam" type="xs:string" use="required" />
                            <xs:attribute name="eggs" type="xs:string" use="required" />
                        </xs:complexType>
                    </xs:choice>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xsi:schema>
Run Code Online (Sandbox Code Playgroud)

但是,当使用lxml尝试加载此架构时,出现以下错误:

>>> from lxml import etree  
>>> etree.XMLSchema( etree.parse("schema_choice.xsd") )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "xmlschema.pxi", line 85, in lxml.etree.XMLSchema.__init__ (src/lxml/lxml.etree.c:118685)
lxml.etree.XMLSchemaParseError: Element '{http://www.w3.org/2001/XMLSchema}element': The content is not valid. Expected is (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*))., line 7
Run Code Online (Sandbox Code Playgroud)

由于错误与我的xs:choice元素的位置有关,我尝试将其放在不同的位置,但无论我尝试什么,我似乎都无法使用它来定义具有一组属性(foobar)的标签或另一个(spameggs)。

这甚至可能吗?如果是这样,那么正确的语法是什么?

Bre*_*ail 5

不幸的是,不可能在 XML 模式中使用带有属性的选择。您将需要在更高级别实施此验证。