Объявление обязательного атрибута элемента в схеме XSD: - PullRequest
12 голосов
/ 07 октября 2011

Я хочу объявить элемент для включения в объявление сложного типа, и у элемента есть обязательный атрибут: "option = MyOption", , но значение атрибута "option" может быть любым, в зависимости отконтекст.

То есть: атрибут «опция» с некоторым неизвестным значением должен быть обязательным в любом документе, использующем сложный тип, содержащий этот элемент.

Пример:

    <xs:element name="SpecialOption" type="xs:string"/>

    <xs:complexType name="SpecialOptions">
        <xs:sequence>
            <xs:element ref="SpecialOption" minOccurs="1" maxOccurs="100"/>
            <xs:element ref="XXX"/>     
        </xs:sequence>
    </xs:complexType>   

В этом случае элемент «SpecialOption» в комплексном типе «SpecialOptions» должен иметь этот обязательный атрибут.

Я не знаюне знает, как объявить обязательный атрибут для элемента в XSD или как указать, что атрибут должен иметь значение, которое еще не известно.

Ответы [ 4 ]

26 голосов
/ 10 октября 2011

Вам необходимо изменить определение элемента «SpecialOption», чтобы включить обязательный атрибут. Обновите этот код:

<xs:element name="SpecialOption" type="xs:string"/>

к этому:

<xs:element name="SpecialOption">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="Option" type="xs:string" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

С этим изменением ваш комплексный тип будет содержать обязательный атрибут «Option» во всех экземплярах элемента «SpecialOption» в комплексном типе «SpecialOptions». Объявление атрибута «Option» типа xs:string позволит передавать любое значение в этом поле.

16 голосов
/ 17 октября 2011

1) Это простой обязательный атрибут строки

<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" type="xs:string" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 

2) Требуется ровно одно из списка допустимых значений:

<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" use="required">
                    <xs:simpleType>  
                        <xs:restriction base="xs:string">  
                            <xs:enumeration value="DE"/>  
                            <xs:enumeration value="EN"/>  
                        </xs:restriction>  
                    </xs:simpleType>  
                </xs:attribute>  
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 

3) Можно использовать диапазонкак ограничение, как в примере ниже.

<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" use="required">
                    <xs:simpleType>  
                        <xs:restriction base="xs:integer">  
                            <xs:minInclusive value="95"/>  
                            <xs:maxInclusive value="137"/>  
                        </xs:restriction>  
                    </xs:simpleType>  
                </xs:attribute>  
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 

4) Ниже атрибут объявляется как список, содержащий десятичные значения.Это позволяет атрибуту содержать подмножество указанных значений, например Option = "6 77 95".

<xs:simpleType name="Items">  
    <xs:restriction base="xs:decimal">  
        <xs:enumeration value="137"/>  
        <xs:enumeration value="95"/>  
        <xs:enumeration value="6"/>  
        <xs:enumeration value="77"/>  
    </xs:restriction>  
</xs:simpleType>  
<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" use="required">
                    <xs:simpleType>  
                        <xs:list itemType="Items"/>  
                    </xs:simpleType>  
                </xs:attribute>  
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 

5) Здесь атрибут объявляется необязательным, но предоставляется значение по умолчанию («тест»), которого иногда достаточно:

<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" type="xs:string" use="optional" default="test"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 
3 голосов
/ 07 октября 2011

Чтобы пометить атрибут как обязательный, вы используете <xs:attribute use="required" />.

Что касается типа, у вас есть выбор встроенных типов XSD (xs: string и т. Д.), Или вы можете определить свой собственный <xs:simpleType /> и использовать его.

UPDATE

Я не уверен, что вы подразумеваете под атрибут должен иметь значение, которое еще не известно . Означает ли это, что значение является строкой, но может быть любой строкой? Или десятичная?

Поскольку это значение атрибута, о котором мы говорим, вы ограничены использованием встроенных типов XSD или определением собственного типа xs:simpleType на основе одного из встроенных типов. Здесь вы можете применить более строгие правила к разрешенному значению, например, расширив xs:string и добавив ограничение регулярного выражения к разрешенным значениям.

<xsd:simpleType name="UKDate">
    <xsd:restriction base="xsd:string">
        <xsd:pattern value="(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\d\d"/>
    </xsd:restriction>
</xsd:simpleType>

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

<xs:attribute use="required" />

Надеюсь, это ответит на ваш вопрос немного яснее.

1 голос
/ 20 октября 2013

Просто вы можете сделать это следующим образом

<xs:element name="SpecialOption">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:whiteSpace value="replace"/>
          <xs:minLength value="1"></xs:minLength>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>

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

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