我有一个带有XML元素A,B和C的XSD。 我希望这些以这种方式出现在父元素中:
A和B可以随时出现,C只有一次,可选。
顺序无关紧要,但A和B最好是“在一起”,
(所以它更像(A*), C?, (B*) | (B*), C?, (A*))
,但“A和B在一起”不是必需的。)
如何使用XSD实现这一目标?
我尝试过的实际XSD:
<!-- Hint -->
<xs:element name="hint">
<xs:complexType mixed="true">
<xs:sequence>
<xs:choice>
<xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="link" minOccurs="0" maxOccurs="unbounded" />
</xs:choice>
<xs:sequence>
<xs:element name="message" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:choice>
<xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="link" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
但那给了我
cos-nonambig: <ns>:link and <ns>:link (or elements from their substitution group) violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles.
答案 0 :(得分:1)
基本上,需要有A,B,C的任何混合,其中C出现 只有一次。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:complexType name="SolutionType">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="A"/>
<xs:element name="B"/>
<xs:element name="C"/>
</xs:choice>
<xs:assert test="count(c) <= 1"/>
</xs:complexType>
</xs:schema>
以上xs:assertion
假设您的意思是“C
最多出现一次”,但可以轻松调整以使C
只出现一次。
答案 1 :(得分:0)
A和B可以随时出现,C只有一次,可选。订单确实如此 无所谓,但A和B理想情况下应该是&#34;在一起&#34;
您必须强制执行排序以避免违反独特粒子归因:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="SolutionType">
<xs:sequence>
<xs:element name="A" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="C" minOccurs="0"/>
<xs:element name="B" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
至少这可以实现您将A
和B
放在一起的偏好。
答案 2 :(得分:0)
“唯一粒子归因”基本上意味着验证期间的每个元素都需要确定性地分配给某个XSD“分支”。在验证XSD时可以检查。
我发现(唯一?)避免歧义的方法是在<xs:choice>
中列出A,B,C的所有组合,同时设置minOccurs="1"
以适当打破歧义。这提供了很多选择,但对于3个元素,仍然可行。
这是我在开头留下'C'的情况:
<xs:sequence>
<xs:element name="message" minOccurs="0" maxOccurs="1"/>
<xs:choice>
<xs:sequence>
<xs:element ref="link" minOccurs="1" maxOccurs="unbounded" />
<xs:element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:sequence>
<xs:element ref="tag" minOccurs="1" maxOccurs="unbounded"/>
<xs:element ref="link" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:sequence/>
</xs:choice>
</xs:sequence>
没有关闭这个问题,我相信即使在XSD 1.0中也有更好的选择。