XSD:如何(A * | B *),C?,(A * | B *)

时间:2015-06-09 13:57:47

标签: xsd

我有一个带有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.

3 个答案:

答案 0 :(得分:1)

  

基本上,需要有A,B,C的任何混合,其中C出现   只有一次。

XSD 1.1解决方案

<?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) &lt;= 1"/>
    </xs:complexType>

</xs:schema>

以上xs:assertion假设您的意思是“C最多出现一次”,但可以轻松调整以使C只出现一次。

答案 1 :(得分:0)

  

A和B可以随时出现,C只有一次,可选。订单确实如此   无所谓,但A和B理想情况下应该是&#34;在一起&#34;

XSD 1.0解决方案

您必须强制执行排序以避免违反独特粒子归因:

<?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>

至少这可以实现您将AB放在一起的偏好。

答案 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中也有更好的选择。