如何允许 XSD 中无序元素的交错?
How to allow interleaving of unordered elements in XSD?
我必须编写一个模式,其中嵌套元素的顺序无关紧要,并且可以有更多相同类型的嵌套元素。
我尝试使用 xs:all
和 xs:sequence
,但它不起作用。
这个XML应该是有效的:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<elementB>B</elementB>
<elementA>A</elementA>
<elementA>A</elementA>
</test>
这是我试过的 XSD:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="test">
<xs:complexType>
<xs:sequence>
<xs:element name="elementA" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="elementB" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
第一个 XSD 架构有排序问题。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="test">
<xs:complexType>
<xs:all>
<xs:element name="elementA" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="elementB" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
第二个 XSD 看起来很有前途,但我无法设置 Intellij 以将其正确用于 XML。 (我在这里切换了 XML Schema 1.1 File->Settings->Languages & Frameworks->Schemas and DTDs->Default XML Schemas
)我的 IntelliJ 版本是 2019.2.3.
显然 XSD 的 xs:sequence
版本强加了一个顺序。
XSD 的 xs:all
版本使用 xs:all/xs:element[@maxOccurs="unbounded"]
,这需要 XSD 1.1。
XML Oxygen 成功验证了你的 XML 与你的 xs:all
XSD。
IntelliJ 有 XSD 1.1 支持,但可能不完整,或者这里的规范不明确——现在没时间研究。
但是,如果您的实际案例与您发布的案例一样简单,您可以使用 xs:choice
实现顺序独立性,而不依赖于 XSD 1.1:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.0">
<xs:element name="test">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="elementA" type="xs:string"/>
<xs:element name="elementB" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
希望这能让您解决任何可能阻碍您的 IntelliJ 问题。
你的第二个模式("promising" 一个)对我有用。在 oXygen 中试过,效果很好。恐怕我不知道如何为 XSD 1.1 验证设置 IntelliJ。
如果固定集合(A、B、C...)中的任何元素可以出现任意次数,则您不需要 XSD 1.1:您可以将内容模型编写为
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="A">
<xs:element name="B">
<xs:element name="C">
</xs:choice>
我必须编写一个模式,其中嵌套元素的顺序无关紧要,并且可以有更多相同类型的嵌套元素。
我尝试使用 xs:all
和 xs:sequence
,但它不起作用。
这个XML应该是有效的:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<elementB>B</elementB>
<elementA>A</elementA>
<elementA>A</elementA>
</test>
这是我试过的 XSD:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="test">
<xs:complexType>
<xs:sequence>
<xs:element name="elementA" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="elementB" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
第一个 XSD 架构有排序问题。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="test">
<xs:complexType>
<xs:all>
<xs:element name="elementA" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="elementB" type="xs:string"
minOccurs="0" maxOccurs="unbounded"/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>
第二个 XSD 看起来很有前途,但我无法设置 Intellij 以将其正确用于 XML。 (我在这里切换了 XML Schema 1.1 File->Settings->Languages & Frameworks->Schemas and DTDs->Default XML Schemas
)我的 IntelliJ 版本是 2019.2.3.
显然 XSD 的 xs:sequence
版本强加了一个顺序。
XSD 的 xs:all
版本使用 xs:all/xs:element[@maxOccurs="unbounded"]
,这需要 XSD 1.1。
XML Oxygen 成功验证了你的 XML 与你的 xs:all
XSD。
IntelliJ 有 XSD 1.1 支持,但可能不完整,或者这里的规范不明确——现在没时间研究。
但是,如果您的实际案例与您发布的案例一样简单,您可以使用 xs:choice
实现顺序独立性,而不依赖于 XSD 1.1:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.0">
<xs:element name="test">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="elementA" type="xs:string"/>
<xs:element name="elementB" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
希望这能让您解决任何可能阻碍您的 IntelliJ 问题。
你的第二个模式("promising" 一个)对我有用。在 oXygen 中试过,效果很好。恐怕我不知道如何为 XSD 1.1 验证设置 IntelliJ。
如果固定集合(A、B、C...)中的任何元素可以出现任意次数,则您不需要 XSD 1.1:您可以将内容模型编写为
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="A">
<xs:element name="B">
<xs:element name="C">
</xs:choice>