XSD和xmllint:用xs:all替换xs:sequence会产生错误

时间:2015-03-19 10:03:00

标签: xsd xmllint

我想验证以下XML,而没有强加点的顺序:

<?xml version='1.0' encoding='ISO-8859-1'?>
<root>
  <name>Map corners</name>
  <point>NW</point>
  <point>SW</point>
  <point>NE</point>
  <point>SE</point>
</root>

我的XSD是:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="point" type="xs:string" fixed="NW"/>
      <xs:element name="point" type="xs:string" fixed="SW"/>
      <xs:element name="point" type="xs:string" fixed="NE"/>
      <xs:element name="point" type="xs:string" fixed="SE"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

xmllint验证我的XML。

但是如果我用xs:all替换xs:sequence(释放顺序约束:SW可能在NW之前),它不会验证,我有以下消息:

my6.xsd:4:element complexType:模式解析器错误:本地复杂类型:内容模型不是确定性的。

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

在XSD 1.0中,不能将xsd:any与重复元素粒子一起使用。你可以这样做:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="point" minOccurs="4" maxOccurs="4">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="NW"/>
                            <xs:enumeration value="SW"/>
                            <xs:enumeration value="NE"/>
                            <xs:enumeration value="SE"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
        <xs:key name="pk_points">
            <xs:selector xpath="point"/>
            <xs:field xpath="."/>
        </xs:key>
    </xs:element>
</xs:schema>