XSD中每个元素只有一个属性

时间:2013-09-12 08:02:31

标签: xml xsd

您可以在下面找到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只接受第一个, 这只是每个元素的一个属性 谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

所以,在XSD 1.0中,这根本不可能。

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

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

更重要的是,如果你对这些属性有这样的条件,我想,情况 表达与子元素相同的东西(具有简单的内容)是完全成熟的。 然后,XSD拥有限制这些孩子的所有手段!