XSD 条件类型赋值默认类型混淆?
XSD conditional type assignment default type confusion?
我尝试用 CTA 设计 XSD。
我有以下 XML:
<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<person version="1">
<firstname>toto</firstname>
<lastname>tutu</lastname>
</person>
<person version="2">
<firstname>toto</firstname>
<lastname>tutu</lastname>
<birthdate>2017-12-18</birthdate>
</person>
</persons>
XSD 看起来像:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:complexType name="person_v1">
<xs:sequence>
<xs:element name="firstname" type="xs:token"/>
<xs:element name="lastname" type="xs:token"/>
</xs:sequence>
<xs:attribute name="version" type="xs:token" use="required" fixed="1"/>
</xs:complexType>
<xs:complexType name="person_v2">
<xs:sequence>
<xs:element name="firstname" type="xs:token"/>
<xs:element name="lastname" type="xs:token"/>
<xs:element name="birthdate" type="xs:date"/>
</xs:sequence>
<xs:attribute name="version" type="xs:token" use="required" fixed="2"/>
</xs:complexType>
<xs:element name="person">
<xs:alternative test="@version=1" type="person_v1"/>
<xs:alternative test="@version=2" type="person_v2"/>
</xs:element>
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element ref="person" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML 针对 XSD 进行了验证,但在 XSD:
- 如果我删除版本属性,它会生效,
- 如果我将版本 1 替换为 3,它会生效,
- 如果我删除了 person 的所有内容,它会生效。
我的XSD一定是少了什么东西。
- If I delete the version attribute, it validates,
应该是这样,因为当没有 xs:alternative
测试匹配时,person
可以是 xs:anyType
每个 Common Mapping Rules for Element Declarations.
- If I replace the version 1 by 3, it validates,
因为与#1 相同的原因。
- If I delete all the content of person, it validates.
不,不是。您可能没有真正将 XML 文档与您的 XSD 相关联,或者您可能不小心将实验 #3 与实验 #1 或 #2 结合在一起。
已更新XSD
以下更新的 XSD 指定默认类型 person
而不是 xs:anyType
以避免意外 #1 和 #2。请注意,它还使用扩展将 person_v1
和 person_v2
声明的公共部分合并到 person_v
中,并满足替代类型必须从公共基础派生的要求 class. (未指定时,它是 xs:anyType
,通常不会引起注意。)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:complexType name="person_v">
<xs:sequence>
<xs:element name="firstname" type="xs:token"/>
<xs:element name="lastname" type="xs:token"/>
</xs:sequence>
<xs:attribute name="version" type="xs:token" use="required"/>
</xs:complexType>
<xs:complexType name="person_v1">
<xs:complexContent>
<xs:extension base="person_v"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="person_v2">
<xs:complexContent>
<xs:extension base="person_v">
<xs:sequence>
<xs:element name="birthdate" type="xs:date"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="person" type="person_v">
<xs:alternative test="@version=1" type="person_v1"/>
<xs:alternative test="@version=2" type="person_v2"/>
</xs:element>
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element ref="person" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
更新: 这是对 person_v
的更新,要求版本为 1
或 2
以解决评论中的问题:
<xs:complexType name="person_v">
<xs:sequence>
<xs:element name="firstname" type="xs:token"/>
<xs:element name="lastname" type="xs:token"/>
</xs:sequence>
<xs:attribute name="version" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
我尝试用 CTA 设计 XSD。 我有以下 XML:
<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<person version="1">
<firstname>toto</firstname>
<lastname>tutu</lastname>
</person>
<person version="2">
<firstname>toto</firstname>
<lastname>tutu</lastname>
<birthdate>2017-12-18</birthdate>
</person>
</persons>
XSD 看起来像:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:complexType name="person_v1">
<xs:sequence>
<xs:element name="firstname" type="xs:token"/>
<xs:element name="lastname" type="xs:token"/>
</xs:sequence>
<xs:attribute name="version" type="xs:token" use="required" fixed="1"/>
</xs:complexType>
<xs:complexType name="person_v2">
<xs:sequence>
<xs:element name="firstname" type="xs:token"/>
<xs:element name="lastname" type="xs:token"/>
<xs:element name="birthdate" type="xs:date"/>
</xs:sequence>
<xs:attribute name="version" type="xs:token" use="required" fixed="2"/>
</xs:complexType>
<xs:element name="person">
<xs:alternative test="@version=1" type="person_v1"/>
<xs:alternative test="@version=2" type="person_v2"/>
</xs:element>
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element ref="person" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML 针对 XSD 进行了验证,但在 XSD:
- 如果我删除版本属性,它会生效,
- 如果我将版本 1 替换为 3,它会生效,
- 如果我删除了 person 的所有内容,它会生效。
我的XSD一定是少了什么东西。
- If I delete the version attribute, it validates,
应该是这样,因为当没有 xs:alternative
测试匹配时,person
可以是 xs:anyType
每个 Common Mapping Rules for Element Declarations.
- If I replace the version 1 by 3, it validates,
因为与#1 相同的原因。
- If I delete all the content of person, it validates.
不,不是。您可能没有真正将 XML 文档与您的 XSD 相关联,或者您可能不小心将实验 #3 与实验 #1 或 #2 结合在一起。
已更新XSD
以下更新的 XSD 指定默认类型 person
而不是 xs:anyType
以避免意外 #1 和 #2。请注意,它还使用扩展将 person_v1
和 person_v2
声明的公共部分合并到 person_v
中,并满足替代类型必须从公共基础派生的要求 class. (未指定时,它是 xs:anyType
,通常不会引起注意。)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
elementFormDefault="qualified"
vc:minVersion="1.1">
<xs:complexType name="person_v">
<xs:sequence>
<xs:element name="firstname" type="xs:token"/>
<xs:element name="lastname" type="xs:token"/>
</xs:sequence>
<xs:attribute name="version" type="xs:token" use="required"/>
</xs:complexType>
<xs:complexType name="person_v1">
<xs:complexContent>
<xs:extension base="person_v"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="person_v2">
<xs:complexContent>
<xs:extension base="person_v">
<xs:sequence>
<xs:element name="birthdate" type="xs:date"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="person" type="person_v">
<xs:alternative test="@version=1" type="person_v1"/>
<xs:alternative test="@version=2" type="person_v2"/>
</xs:element>
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element ref="person" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
更新: 这是对 person_v
的更新,要求版本为 1
或 2
以解决评论中的问题:
<xs:complexType name="person_v">
<xs:sequence>
<xs:element name="firstname" type="xs:token"/>
<xs:element name="lastname" type="xs:token"/>
</xs:sequence>
<xs:attribute name="version" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>