专家。
我有以下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
类型的标签名称?
干杯!
答案 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}}