XML-схема Как объявить цену и валюту - PullRequest
8 голосов
/ 16 января 2012

Я создаю схему XML, в которой хранится информация о домах.

Я хочу сохранить price и currency.

В моем понимании имеет смысл объявитьэто благодаря наличию валюты в качестве атрибута элемента цены.

Кроме того, я хочу ограничить значения, которые можно ввести как currency, фунтами, евро или долларами.

EG:

<price currency="euros">10000.00</price>

Итак, на данный момент я объявляю это в своей XML-схеме следующим образом:

<!-- 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>

... или я на правильном пути?

Ответы [ 5 ]

14 голосов
/ 25 января 2012

Взято по ссылке, опубликованной Майклом Кейем, и применено к вашей проблеме. (Примечание: используйте тип «десятичный» вместо «двойной», чтобы избежать ошибок точности.)

<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>
4 голосов
/ 17 января 2012

Вы хотите «сложный тип с простым контентом».Вы можете найти пример здесь:

http://www.w3schools.com/schema/el_simpleContent.asp

3 голосов
/ 26 января 2012

или как продолжение ответа Майклза:

<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>

если хотите в одном теге. это просто добавляет атрибут с перечислением к десятичному типу, так что желаемый результат будет достигнут.

2 голосов
/ 21 января 2012

Ниже определяется, что элемент 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>
0 голосов
/ 26 января 2012

В качестве практического метода использования рассмотрим реализацию SOAP API PayPal .

Сервис определяет набор кодов для валют (CurrencyCodeType, определенный в eBLBaseComponents.xsd), следующим образом стандарт ISO-4217 .

AmountType (определяется CoreComponentTypes.xsd) представляет собой композицию типа double с атрибутом currencyType.

Я бы рекомендовал использовать аналогичный подход в вашем приложении, ограничивая допустимые валюты в вашембизнес-логика, а не в схеме.

Ура!

...