#xsd
#xsd
Вопрос:
Я хочу объявить элемент, который будет включен в объявление сложного типа, и у элемента есть обязательный атрибут: «option = MyOption», но значение атрибута «option» может быть любым, в зависимости от контекста.
То есть: атрибут «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 или как указать, что атрибут должен иметь значение, которое еще не известно.
Ответ №1:
Вам необходимо изменить определение элемента «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
позволит передавать любое значение в этом поле.
Комментарии:
1. Звучит хорошо — это то, что мне нужно было знать: как сделать атрибут обязательным компонентом элемента. «Объявление атрибута «Option» типа xs:string позволит передавать любое значение в этом поле». Понятно — но мне может быть лучше, если объявить тип перечисления и расширять его по мере развития моих потребностей. Попробую ваш код — если он работает, вы получили награду.
Ответ №2:
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) Здесь атрибут объявляется необязательным, но ему присваивается значение по умолчанию («test»), которого иногда бывает достаточно:
<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>
Комментарии:
1. 1 — Ваш ответ подробный и очень информативный, но я дал награду за ответ 2, потому что он был достаточным и появился намного раньше вашего. Спасибо
2. Спасибо, тем не менее, это было вовремя, и я учел ваши комментарии. Однако я понимаю, что ответа 2 было достаточно, так что никаких проблем :]
Ответ №3:
Чтобы пометить атрибут как обязательный, вы используете <xs:attribute use="required" />
.
Что касается типа, у вас есть выбор из встроенных типов XSD (xs: string и т. Д.), Или вы можете определить свой собственный <xs:simpleType />
и использовать его.
Обновить
Я не уверен, что вы подразумеваете под атрибутом, который должен иметь значение, которое еще не известно. Означает ли это, что значение является строкой, но может быть любой строкой? Или десятичное число?
Поскольку мы говорим о значении атрибута, вы ограничены использованием встроенных типов 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)dd"/>
</xsd:restriction>
</xsd:simpleType>
Однако, если нет абсолютно никакого способа узнать, какое значение будет использоваться, тогда у вас есть хорошо известный временной парадокс, при котором вы не можете ограничить что-либо во время разработки значением, которое вы знаете только во время выполнения. В этом случае, конечно, необходимо только указать, что атрибут должен хотя бы присутствовать?
<xs:attribute use="required" />
Надеюсь, это ответит на ваш вопрос немного более четко.
Комментарии:
1. На самом деле не намного понятнее — вы не объяснили, как объявить элемент, который включает обязательный атрибут.
Ответ №4:
Просто вы можете сделать это следующим образом
<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-тега.