xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Одновременное задание в XSD схеме паттерна для текста и аттр


Автор Сообщение
eugene
Гость




[4660] Пт Июл 11, 2003 11:50
Одновременное задание в XSD схеме паттерна для текста и аттр
Недавно xsd занялся, поэтому извините если в терминах запутаюсь.

Задача такая
есть тэг, который должен содержать определённый текст (соответствующий паттерну) и атрибут. Как задать его описание?
Не работает ни такая конструкция

<xsd:element name="custom-attribute">
<xsd:complexType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}"/>
</xsd:restriction>
<xsd:attribute name="name" type="simpleType.ProductType"/>
</xsd:complexType>
</xsd:element>

Ни такая
<xsd:element name="custom-attribute">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}"/>
</xsd:restriction>
<xsd:attribute name="name" type="simpleType.ProductType"/>
</xsd:simpleType>
</xsd:element>

В первом случае ругань на restriction, во втором на attribute. Однакож думаю решение должно быть, уж больно задача выглядит типичной. Может кто направит на правильный путь?
shade33
Новичок

Зарегистрирован: 29.04.2002
Сообщения: 37
Откуда: Москва
Посетить сайт автора
[4662] Пт Июл 11, 2003 12:16

Во-втором случае, ошибка, как минимум, с SimpleType - он не может содержать атрибутов.
Paranorm
Студент

Зарегистрирован: 24.04.2002
Сообщения: 81

Посетить сайт автора
[4667] Сб Июл 12, 2003 22:52
Re: Одновременное задание в XSD схеме паттерна
Элемент xsd:restriction может быть дочерним элементом у xs:simpleType, xsd:simpleContent или xsd:complexContent. Два последних элемента (xsd:simpleContent и xsd:complexContent) в свою очередь должны являться дочерними у xsd:complexType.
Однако написать сразу по твоему примеру так:
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="xs:string">
...

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

Сначала объявим простой тип, основанный на ограничении базового простого типа xs:string по твоему паттерну:

<xs:simpleType name="custom-attribute-base">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-[A-Z]{2}"/>
</xs:restriction>
</xs:simpleType>


А затем унаследуем от него твой сложный тип, добавив в него необходимый аттрибут:

<xs:complexType name="custom-attribute">
<xs:simpleContent>
<xs:extension base="custom-attribute-base">
<xs:attribute name="name" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>

Я внес некоторые изменения в твой пример, которые отмечу:
1) Поменял префикс пространства имен схемы с xsd на xs (извините, мне так просто проще)
2) Заменил твой тип simpleType.ProductType на простой xs:string (но, естественно, только потому, что не знаю я такого типа и как он у тебя описан).
Тебе остается вернуть обратно свой simpleType.ProductType и все должно zarabotok.bbspam.com.

Я у себя проверил: все работает - и схема валидируется, и документы этой схемой тоже валидируются.
Бывает же, найдет в субботу вечером настроение Wink Если что не получится - спашивай.