我有以下 XML 标记
<price currency="euros">20000.00</price>
如何将货币属性限制为以下之一:
欧元
磅
美元
价格翻倍?
当我尝试在两者上输入类型时,我只是得到一个错误,这是我到目前为止所得到的:
<xs:element name="price">
<xs:complexType>
<xs:attribute name="currency">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
您的价格定义中似乎缺少数值。尝试以下操作:
<xs:simpleType name="curr">
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
<xs:element name="price">
<xs:complexType>
<xs:extension base="xs:decimal">
<xs:attribute name="currency" type="curr"/>
</xs:extension>
</xs:complexType>
</xs:element>
老问题的新答案
这个老问题的现有答案都没有解决真正的问题。
真正的问题是 xs:complexType
不能直接将 xs:extension
作为 XSD 中的子级。解决方法是先使用 xs:simpleContent
。详情如下...
你的 XML,
<price currency="euros">20000.00</price>
将对以下任一更正的 XSD 有效:
本地定义的属性类型
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="price">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="currency">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
全局定义的属性类型
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="currencyType">
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
<xs:element name="price">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="currency" type="currencyType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
笔记
正如@Paul 评论的那样,这些确实将价格的内容类型从 xs:string 更改为 xs:decimal,但这并不是绝对必要的,也不是真正的问题。
正如@user998692 所回答的那样,您可以分离出货币的定义,并且可以更改为 xs:decimal,但这也不是真正的问题。
真正的问题是 xs:complexType
不能直接将 xs:extension
作为 XSD 中的子级;首先需要 xs:simpleContent
。
一个相关的问题(没有被问到,但可能混淆了其他答案):
如果 price
有一个属性,它怎么会受到限制?
在这种情况下,需要对 priceType
进行单独的全局定义;仅使用本地类型定义是不可能做到这一点的。
元素具有属性时如何限制元素内容
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="priceType">
<xs:restriction base="xs:decimal">
<xs:minInclusive value="0.00"/>
<xs:maxInclusive value="99999.99"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="price">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="priceType">
<xs:attribute name="currency">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
您需要创建一个类型并创建该类型的属性:
<xs:simpleType name="curr">
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
然后:
<xs:complexType>
<xs:attribute name="currency" type="curr"/>
</xs:complexType>
不定期副业成功案例分享
<xs:extension
不能直接是<xs:complexType
的子级,而是还必须包含在<xs:complexContent
或<xs:simpleContent
中。