gpt4 book ai didi

XSD:指定一个选项必须至少有一个列表,但每个选项不超过一个

转载 作者:行者123 更新时间:2023-12-01 02:41:26 25 4
gpt4 key购买 nike

这已经让我发疯了好几个小时。我已经阅读了关于 SO 和 Internet 其余部分的所有相关 XSD 问题,但似乎仍然没有答案。

我需要一个 XML 模式,它要求至少存在一个元素列表,但每个元素可能只出现 0 或 1 次。

这类似于这个问题:
XML schema construct for "any one or more of these elements but must be at least one"

但我无法限制上限:我显然在使用 maxOccurs不正确。

这是我离开我的模式的地方:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Selects">
<xs:sequence minOccurs="2" maxOccurs="4">
<xs:choice>
<xs:element name="aaa" minOccurs="1" maxOccurs="1"/>
<xs:element name="bbb" minOccurs="1" maxOccurs="1"/>
<xs:element name="ccc" minOccurs="1" maxOccurs="1"/>
<xs:element name="ddd" minOccurs="1" maxOccurs="1"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:element name="baseElement">
<xs:complexType>
<xs:sequence>
<xs:element name="MyChoice" type="Selects"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

我试过 minOccursmaxOccurs在选择和元素上没有运气。这是验证的 XML,但我不希望它:

<?xml version="1.0" encoding="UTF-8"?>
<baseElement xsi:noNamespaceSchemaLocation="myTest.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MyChoice>
<ddd/>
<ddd/>
</MyChoice>
</baseElement>

如果可能,这是我想要的示例:

<?xml version="1.0" encoding="UTF-8"?>
<baseElement xsi:noNamespaceSchemaLocation="myTest.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MyChoice>
<ddd/>
<aaa/>
<ccc/>
</MyChoice>
</baseElement>

我想投诉多个 ddd元素,但允许任何或所有其他元素以任何顺序。如果我在 MyChoice 下只有一个元素,我会收到一个错误,所以至少有些东西是有效的。

我究竟做错了什么?如何防止多个相同元素验证?

更新

这是我的解决方案(来自以下答案的评论):

实际上, xs:all 做到了。我交换了所有选择,并为每个元素添加了 minOccurs="0"maxOccurs="1"。对于 xs:all,minOccurs 必须为 0 或 1,maxOccurs 必须为 1。感谢您的帮助 - 我现在可以开始了!

最佳答案

只需移动 <xs:sequence minOccurs="2" maxOccurs="4">从周围的选择到你想进一步使用它的地方。 (您也可以删除最小/最大出现 = 1,因为这是 xs:choice 所做的)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Selects">
<xs:choice>
<xs:element name="aaa" />
<xs:element name="bbb" />
<xs:element name="ccc" />
<xs:element name="ddd" />
</xs:choice>
</xs:complexType>
<xs:element name="baseElement">
<xs:complexType>
<xs:sequence minOccurs="2" maxOccurs="4">
<xs:element name="MyChoice" type="Selects" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

这验证了以下内容:
<baseElement xsi:noNamespaceSchemaLocation="myTest.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MyChoice>
<bbb></bbb>
</MyChoice>
<MyChoice>
<ccc></ccc>
</MyChoice>
</baseElement>

更新

我认为您已经达到了使用 XSD 所能达到的极限。除了为每个可能的单个组合定义 MyChoice 类型的“版本”(然后需要不同的名称 MyChoice1、MyChoice2 等)之外,我看不到任何其他方法可以做到这一点

您也可以使用 xs:all
  <xs:complexType name="Selects">
<xs:all minOccurs=2 maxOccurs=4>
<xs:element name="aaa" />
<xs:element name="bbb" />
<xs:element name="ccc" />
<xs:element name="ddd" />
</xs:all>
</xs:complexType>

但这不会阻止您拥有四个 <ddd/>

关于XSD:指定一个选项必须至少有一个列表,但每个选项不超过一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8224743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com