XML模式 - 通过枚举验证标记名称

时间:2017-03-08 17:01:51

标签: xml xsd

专家。

我有以下XSD部分:

<!-- Enumeration of supported types -->
<xs:simpleType name="SupportedTypes">
    <xs:restriction base="xs:string">
        <xs:enumeration value="creditCard" />
        <xs:enumeration value="directDebit" />
        <xs:enumeration value="paypal" />
        <xs:enumeration value="webmoney" />
    </xs:restriction>
</xs:simpleType>

当我想检查instace的属性值(下面的XSD)时,这非常有效:

<!-- this is what I know how to make, not what I want to do :) -->
<xs:element name="PaymentType" type="SupportedTypes" />

但如果我有一个付款类型列表,例如(下面的XML):

<!-- existing XML that I need to validate (preferably by the same enum) -->
<paymentTypes>
    <creditCard price="123.50" />
    <webmoney price="100.00" />
    <directDebit never="true" />
</paymentTypes>

有没有办法再次检查现有SupportedTypes类型的标签名称?

干杯!

1 个答案:

答案 0 :(得分:1)

不,您不能使用简单类型的声明来指定子元素的名称。

您可以通过xs:list获得一系列枚举,但您还希望将价格数据与每个条目相关联,因此xs:list SupportedTypes并不是您真正想要的。

您可以拥有一个属性@type,其类型可以是SupportedTypes

<paymentTypes>
    <paymentType type="creditCard" price="123.50" />
    <paymentType type="webmoney" price="100.00" />
    <paymentType type="directDebit" never="true" />
</paymentTypes>

在XSD 1.1下,您甚至可以使用条件类型分配根据@type的值分配关联元素的类型。

或者,您可以保留当前的XML并简单地为paymentTypes指定正常内容模型,该模型由多个(通常定义的)子元素creditCard,{{1}的序列/全部/选项组成}和webmoney

更新或者,正如Michael Kay在评论中添加的那样,您可以使用 substitution group ,如{ {3}}