Подтвердить что ты не робот

XML-схема Как ограничить атрибут путем перечисления

У меня есть следующий тег XML

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

Как ограничить атрибут валюты одним из следующих:

  • евро
  • фунтов
  • долларов

И цена удваивается?

Я просто получаю сообщение об ошибке, когда я пытаюсь установить тип на обоих, вот что у меня до сих пор:

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency" type="xs:string">
            <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>
4b9b3361

Ответ 1

Числовое значение, по-видимому, отсутствует в определении цены. Попробуйте следующее:

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

Ответ 2

Новый ответ на старый вопрос

Ни один из существующих ответов на этот старый вопрос не затрагивает реальную проблему .

Реальная проблема заключалась в том, что 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, они меняют тип содержимого price от 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>

Ответ 3

вам нужно создать тип и сделать атрибут этого типа:

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

Ответ 4

<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

Это позволит полностью исключить необходимость перечисления. При необходимости вы можете изменить тип, чтобы удвоить.