2013-03-28 1 views
0

Я далМогу ли я создать схему XSD, которая помещает атрибут на определенный сложный тип?

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    targetNamespace="AdditionalAttribute.OtherXSD" 
    xmlns:o="AdditionalAttribute.OtherXSD" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name="Tag" type="o:TagType" /> 
    <xs:complexType name="TagType" /> 
</xs:schema> 

, и я хочу написать

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    targetNamespace="AdditionalAttribute.MyXSD" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <!-- ? --> 
</xs:schema> 

так это становится действительным XML:

<?xml version="1.0" encoding="UTF-8"?> 
<o:Tag 
    xmlns:o="AdditionalAttribute.OtherXSD" 
    xmlns:m="AdditionalAttribute.MyXSD" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
    AdditionalAttribute.OtherXSD AdditionalAttribute.OtherXSD.xsd 
    AdditionalAttribute.MyXSD AdditionalAttribute.MyXSD.xsd 
    " 
    m:AdditionalAttribute="Value" 
/> 

Я знаю о similar question, that asks how to place an additional attribute to all complex types в другой XSD. Ответ на это - нет. Тем не менее, я не эксперт в этом и из ответов, которые я не могу получить, если бы это было возможно для определенного сложного типа. Я пробовал несколько вещей без успеха, и кажется, что это возможно только для xsd: extension'ing или xsd: ограничение сложного типа, таким образом, отбрасывая новый, что не то, что я хочу. Я хочу «объединить» атрибуты по одному и тому же тегу:

<o:Tag o:...=...   /> 
+ <o:Tag   m:...=... /> 
= <o:Tag o:...=... m:...=... /> 

Это возможно и как?

ответ

0
<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:o="AdditionalAttribute.OtherXSD" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="AdditionalAttribute.MyXSD" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="AdditionalAttribute.OtherXSD" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:import namespace="AdditionalAttribute.MyXSD" /> 
    <xs:element name="Tag"> 
    <xs:complexType> 
     <xs:attribute ref="m:AdditionalAttribute" use="required" /> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

Я думаю, что это не делает то, что я хочу. Я обменял пространства имен «MyXSD» и «OtherXSD» здесь, потому что это MyXSD, который я могу редактировать, и который может импортировать OtherXSD. Я хочу добавить дополнительный (новый) атрибут в другой тег. С этим здесь XMLLint дает мне: 'AdditionalAttribute.MyXSD.xsd: 11: атрибут элемента: ошибка парсера схемы: использование атрибута (неизвестно), атрибут 'ref': значение QName '{AdditionalAttribute.OtherXSD} AdditionalAttribute' не разрешает (n) объявление атрибута. Схема WXS AdditionalAttribute.MyXSD.xsd не удалось скомпилировать ' – Max

0

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

  • тег идентифицируется квалифицированным именем (QName), состоящим из имени и пространства имен.
  • тип тега определяет его допустимое содержание

Что вы предлагаете добавить новый атрибут «Tag», и таким образом изменить его тип для некоторых потребителей модели XSD.

Сказав это, вы можете делать то, что хотите, при условии, что вы готовы добавить атрибут xsi: type в XML. Учитывая, что о: TagType является пустым типом, вы можете также сделать это таким образом:

<m:Tag xsi:type="m:TagWithAttribute" m:additionalAttribute="Value" /> 
  • грима O: TagType абстрактного типа
  • использование Xs: расширение для создания «м нового типа: TagWithAttribute»основан на о: TagType

добавляя XSI: тип атрибута, схема валидатор может отличить ваше использование„Tag“от кого-то другого, кто хочет, чтобы это было подтверждено по-разному. Другими словами, XML Schema обеспечивает сильную типизацию (xs: redefines обходит сильную типизацию, поэтому некоторым людям это не нравится).