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

У меня есть такой файл XML

<listOfA>
  <a type="1">
    <name></name>
    <surname></surname>
  </a>
  <a type="2">
    <name></name>
    <id></id>
  </a>
</listOfA>

Я хотел бы сделать XSD, чтобы, если значение атрибута «тип» равно 1, должны присутствовать элементы имени и фамилии, а когда это 2, имя и идентификатор должны быть там. Я попытался сгенерировать XSD в генераторе схемы XSD, но он сделал элементы фамилии и идентификатора минПроисходит=0. Как я мог заставить его работать?


person DropDropped    schedule 10.01.2015    source источник
comment
Это случай, охватываемый условным назначением типа в XSD 1.1. Вы можете использовать XSD 1.1? Вы не сможете применить такое ограничение, используя только XSD 1.0; потребуется использовать необязательность в XSD 1.0, а затем связать вещи за пределами XSD.   -  person kjhughes    schedule 10.01.2015
comment
@kjhughes XSD 1.1 не проблема   -  person DropDropped    schedule 10.01.2015


Ответы (1)


Это можно сделать с помощью условного назначения типа< в XSD 1.1. /сильный>:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           elementFormDefault="qualified"
           vc:minVersion="1.1"> 
  <xs:element name="listOfA">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="a" maxOccurs="unbounded">
          <xs:alternative test="@type = 1" type="a1Type"/>        
          <xs:alternative test="@type = 2" type="a2Type"/>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="a1Type">
    <xs:sequence>
      <xs:element name="name"/>
      <xs:element name="surname"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="a2Type">
    <xs:sequence>
      <xs:element name="name"/>
      <xs:element name="id"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
person kjhughes    schedule 10.01.2015
comment
MS VS 2015 выдает ошибку The 'w3.org/2001/XMLSchema:alternative ' элемент не поддерживается в этом контексте при простом копировании (см. выше) на пустую страницу, - person Jan Bergström; 24.07.2016
comment
Это связано с тем, что .NET напрямую не поддерживает XSD 1.1 (что, как указывает этот вопрос, является приемлемым). Если вы используете .NET и хотели бы использовать XSD 1.1, попросите Microsoft добавить поддержку или используйте Saxon. - person kjhughes; 24.07.2016
comment
Хорошее объяснение. Я так понимаю это основная слабость XSD 1.1, он не новый и мало реализованный? И насколько проблематично использовать в коммерческом стандартном ПО (как это делаю я), в отличие от собственных разработок? Насколько я знаю, ‹xs:alternative test= — это единственный способ управлять правильными путями переменных в XSD, или нет? - person Jan Bergström; 26.07.2016
comment
Если XML можно изменить, можно избежать необходимости в XSD 1.1 и CTA. (Думайте <typeA/>, а не <item type="typeA"/>.) Однако, пожалуйста, задайте новый вопрос, а не продолжайте обсуждение в нескольких направлениях в комментариях. Спасибо. - person kjhughes; 26.07.2016
comment
Хорошо, эта ветка комментариев завершена, и все в порядке. Я не буду переделывать XML, но ваш ответ поможет мне понять условия современного XML. - person Jan Bergström; 27.07.2016
comment
Я хотел бы использовать эту функцию в coldfusion. Как узнать, поддерживает ли моя версия ColdFusion XSD 1.1? - person Sander; 21.08.2017
comment
@Sander: Если вы не можете определить, поддерживает ли ColdFusion XSD 1.1 из его документации, вы всегда можете просто попробовать. Если он не поддерживает XSD 1.1, вы должны получить сообщение об ошибке о том, что содержимое элемента, обертывающего xs:alternative, не соответствует ожидаемой модели содержимого XSD 1.0 ((annotation?, (simpleType | complexType)?, (unique | key | keyref)*)). - person kjhughes; 21.08.2017