我正在创建一个存储房屋信息的XML架构。
我想存储price
和currency
。
在我看来,通过将货币作为价格元素的属性来声明这一点是有道理的。
另外,我想将可以作为currency
输入的值限制为磅,欧元或美元。
EG:
<price currency="euros">10000.00</price>
所以目前我在我的XML Schema中将其声明为:
<!-- House Price, and the currency as an attribute -->
<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>
我对此有这个问题:
pounds, euros or dollars
我似乎无法将价格上的type
指定为双倍,正如我所希望的那样:
Element 'price' has both a 'type' attribute and a 'anonymous type' child. Only one of these is allowed for an element.
我应该保持简单并将它们声明为单独的元素:
<price>10000.00</price>
<currency>euros</currency>
......还是我走在正确的道路上?
答案 0 :(得分:14)
取自Michael Kay发布的链接并应用于您的问题。 (注意:使用'decimal'类型而不是'double'来避免精度错误。)
<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:simpleType name="currencyType">
<xs:restriction base="xs:string">
<xs:enumeration value="pounds"/>
<xs:enumeration value="euros"/>
<xs:enumeration value="dollars"/>
</xs:restriction>
</xs:simpleType>
---- Example ----
<price currency="euros">10000.00</price>
答案 1 :(得分:4)
您需要“具有简单内容的复杂类型”。你可以在这里找到一个例子:
答案 2 :(得分:3)
或作为迈克尔斯答案的延伸:
<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>
如果你想在一个标签中。只需将枚举属性添加到十进制类型,就可以实现所需的结果。
答案 3 :(得分:2)
以下内容将price
元素定义为xs:double
值,其currency
属性的值限制为:磅,欧元或美元。
<xs:element name="price">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:double">
<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>
答案 4 :(得分:0)
作为使用中的做法,请查看PayPal's SOAP API的实现。
该服务为ISO-4217 standard之后的货币(在eBLBaseComponents.xsd中定义的CurrencyCodeType)定义了一组代码。
AmountType(由CoreComponentTypes.xsd定义)是具有currencyType属性的double的组合。
我建议在您的应用程序中使用类似的方法,限制业务逻辑中的可接受货币,而不是模式。
干杯!