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

XSD:如何拥有(A*| B*),C?,(A*| B*),xsd,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">

我有一个包含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::link和:link(或其替换组中的元素)违反“唯一粒子属性”。在根据该模式进行验证期间,将为这两个粒子创建歧义。


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

XSD1.1解决方案

上面的
xs:assertion
假设您的意思是“
C
最多出现一次”,但是可以很容易地调整为要求
C
恰好出现一次

A和B可以随时出现,C只能出现一次(可选)。命令是这样的 没关系,但A和B最好是“在一起”

XSD1.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>

至少这实现了您对将
A
B
保持在一起的偏好。

唯一粒子属性基本上意味着验证期间的每个元素都需要确定地分配给某个XSD“分支”。这可以在验证XSD时进行检查

我发现(唯一?)避免歧义的方法是在A
中列出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中也有更好的选择。

是否要添加实际XML中的示例?不需要匹配a和B计数。基本上,需要的是a、B、C的任意组合,其中C只出现一次。您的XSD显示4个不同的元素(标记、链接、消息、标记2),而您的示例仅显示a,B和C。因为2x标记不是有效的XSD。您比任何人都更了解您的要求,但在我看来,要求出现
a
B
比要求仍然满足原始基数要求更大的让步。
        <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>