0

您可以在下面找到 XSD 的一部分:

<xs:element name="MyElement" minOccurs="0" maxOccurs="1">
    <xs:complexType>
        <xs:choice>
            <xs:element maxOccurs="unbounded" name="MyChildElement">
                <xs:complexType>
                    <xs:attribute name="MyAttribute1" type="xs:decimal" use="optional" />
                    <xs:attribute name="MyAttribute2" type="xs:decimal" use="optional" />
                    <xs:attribute name="MyAttribute3" type="xs:decimal" use="optional" />
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:complexType>
</xs:element>

它接受这两种 XML:

<MyElement>
    <MyChildElement MyAttribute1="10" />
    <MyChildElement MyAttribute2="10" />
</MyElement>

<MyElement>
    <MyChildElement MyAttribute1="10" MyAttribute2="10" MyAttribute3="10" />
</MyElement>

我想知道是否有办法强制 XSD 只接受第一个,即每个元素只有一个属性。
谢谢你。

4

2 回答 2

1

没有明确的方式来表达与其他属性相关的特定属性的存在的任何特殊条件。

(毕竟,属性应该表达元素所表达的实体所固有的东西。例如,一个人是否有可能只有在他没有耳朵的情况下才有鼻子?)

因此,在 XSD 1.0 中,这完全是不可能的。

在 XSD 1.1 中<xs:assert>,可以在 complexType 中添加一个元素来检查它的特殊之处(尤其是关于属性)。然后,可能会编写一些 XPath 表达式来测试您的条件(例如,它MyAttribute1="10" MyAttribute2="10"是无效的)。

但另一个问题是现在很少有工具支持 XSD 1.1。

更重要的是,如果你对那些属性有这样的条件,我认为,表达与子元素相同的东西(内容简单)的情况完全成熟。那么,XSD 有办法约束那些孩子!

于 2013-09-12T09:58:02.337 回答
1

不在 XSD 1.0 中。在 XSD 1.1 中,您可以使用断言来实现。XSD 1.1 目前仅在 Saxon 和 Xerces 中受支持。

于 2013-09-12T09:43:01.837 回答