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

StackOverflow https://stackoverflow.com//questions/25067873

  •  26-12-2019
  •  | 
  •  

Вопрос

Я хотел бы спросить, возможно ли это и если да, как это добиться:

Например, если у меня есть определение элемента с помощью CompareType в определении схемы XML, подобное это:

<xsd:element name="tag" type="tag"/>
<xs:complexType name="tag">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="subtag" type="subtag"/>
        <xs:element name="another_subtag" type="another_subtag"/>
        <xs:element name="another_subtag_2" type="another_subtag_2"/>
    </xs:choice>
    <xs:attribute name="type" type="attr_type"/>
    <xs:attribute name="an_attr" type="an_attr"/>
    <xs:attribute name="another_attr" type="another_attr"/>
</xs:complexType name="attr_type">
    <xsd:restriction base="xsd:string">
         <xsd:enumeration value="type_1"/>
         <xsd:enumeration value="type_2"/>
         <xsd:enumeration value="type_3"/>
    </xsd:restriction>
<xsd:simpleType/>
.

1) Можно ли сделать атрибут ' an_attr ' an_attr 'элемент тегов требуется только , если элемент тега имеет атрибут' attr_type ', установленный на' type_2 ' ?

И еще один вопрос: 2) Можно ли сделать CompartyType 'Tag' CONSERTYTEPE CONTEMATION CONTECT REFCATE ELEVES, на основе E.g. на значение «attr_type»? Например для:

<tag attr_type="type_1">
.

Есть только этот ребенок:

<xs:element name="subtag" type="subtag"/>
.

и для:

<tag attr_type="type_2">
.

имеют только детские:

 <xs:element name="another_subtag" type="another_subtag"/>
OR
 <xs:element name="another_subtag_2" type="another_subtag_2"/>
.

?

Если это возможно, как я могу добиться этого?

Спасибо за внимание!

Редактировать: как я видел здесь -> https://blogs.orcle.com/rammen/ запись / xml_schema_11_what_you_need_to В примере № 22 (в условные присвоения типа ), могла ли это сделать таким образом?

<!--inline alternative type definitions --> 
<element name="TimeTravel" type="TravelType"> 
      <alternative test="@direction='Future'"> 
          <complexType> 
              <complexContent> 
              <restriction base="TravelType" 
                         .... 
<!--        some past travel related elements go here --> 
            </complexType> 
       </alternative> 
      <alternative test="@direction='Past'"> 
          <complexType> 
              <complexContent> 
              <restriction base="TravelType" 
                         .... 
   <!--        some future travel related elements go here --> 
            </complexType> 
       </alternative> 
  </element> 
                          OR 
<!--Named alternative type definitions --> 
<element name="TimeTravel" type="TravelType"> 
   <alternative test="@direction='Future' type="FutureTravelType"/> 
   <alternative test="@direction='Past' type="PastTravelType"/> 
</element>
.

Как я понял это, элемент TimeTravel может иметь разные CompareTypes на основе значения атрибута направления, я правильно? Но он говорит, что XSD 1.1 необходимо использовать. Могу ли я использовать это правила внутри моей схемы XML?

Это было полезно?

Решение

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

Вопрос 1: возможно ли сделать атрибут «an_attr» элемента тегов, необходимый только в том случае, если элемент тега имеет атрибут «ATITTYPE», установленный на «Type_2»?

Ответ 1: Да. Вы можете сделать это, как это (проверено; изменено из оригинала, чтобы избежать ссылки на нерелевантные и неопределенные типы):

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="tag" type="tagType">
      <xs:alternative test="@attr_type='type_2'" type="tagTypeWithMandatoryAttr"/>
    </xs:element>

    <xs:complexType name="tagType">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="subtag" type="xs:anyType"/>
            <xs:element name="another_subtag" type="xs:anyType"/>
            <xs:element name="another_subtag_2" type="xs:anyType"/>
        </xs:choice>
        <xs:attribute name="type" type="xs:string"/>
        <xs:attribute name="an_attr" type="xs:string"/>
        <xs:attribute name="another_attr" type="xs:string"/>
    </xs:complexType>

    <xs:complexType name="tagTypeWithMandatoryAttr">
     <xs:complexContent>
      <xs:restriction base="tagType">
          <xs:choice maxOccurs="unbounded">
            <xs:element name="subtag" type="xs:anyType"/>
            <xs:element name="another_subtag" type="xs:anyType"/>
            <xs:element name="another_subtag_2" type="xs:anyType"/>
          </xs:choice>
          <xs:attribute name="type" type="xs:string"/>
          <xs:attribute name="an_attr" type="xs:string" use="required"/>
          <xs:attribute name="another_attr" type="xs:string"/>
      </xs:restriction>
     </xs:complexContent>
    </xs:complexType>
</xs:schema>
.

Вопрос 2:

Можно ли сделать CompertyType «тег», содержать разные элементы дочерних элементов снова, например, E.g. на значение «attr_type»?

Ответ 2:

Да, например (аналогично проверено):

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="tag" type="xs:anyType">
      <xs:alternative test="@attr_type='type_2'" type="tagType1"/>
      <xs:alternative type="tagType2"/>
    </xs:element>

    <xs:complexType name="tagType1">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="subtag" type="xs:anyType"/>
            <xs:element name="another_subtag" type="xs:anyType"/>
            <xs:element name="another_subtag_2" type="xs:anyType"/>
        </xs:choice> 
    </xs:complexType>

    <xs:complexType name="tagType2">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="subtag" type="xs:anyType"/>
            <xs:element name="another_subtag" type="xs:anyType"/>
            <xs:element name="another_subtag_2" type="xs:anyType"/>
        </xs:choice> 
    </xs:complexType>
</xs:schema>
.

Вопрос 0: возможно ли определить атрибут элемента XML (E), который требуется только если атрибут другого элемента (F) установлен на конкретное значение?

Ответ 0: Это зависит от отношения двух элементов E и F. Если F является предком e, то это может быть сделано с использованием условного типа приведенности в декларации F. Если E и F - братья и или более Отдаленно связанные, то это не может быть сделано с использованием условного назначения типа, но это можно сделать с использованием утверждения, прикрепленного к общему предку E и F.

Другие советы

Это возможно в XSD 1.1, используя новую функцию «Условный тип присваивания».Это позволяет определить тип элемента как функцию значений его атрибутов.

XSD 1.1 реализован в Altova, Saxon и Xerces.

Нет, потому что условное назначение типа (упомянутое в другом ответе) только назначает тип к элементу. Следовательно, имя, условное назначение типа. Кроме того, при использовании условного назначения типа тип элемента определяется своими собственными атрибутами, а не атрибутами некоторых других элементов.

Даже используя выражение XPath с условным присвоением типа, вы можете получить доступ только к атрибутам проверяемого элемента. Он не может получить доступ к своим родителям или предкам, и он даже не может получить доступ к своим детям или потомкам, таким как утверждения могут.

[править] Основной вопрос, как указано, спросил, может ли 1-й атрибут может потребоваться на основе атрибута другого элемента, ответ на то, что нет.

Это потребовало бы гораздо более высокий уровень проверки, чем можно сделать с XML Schema 1.1. Может быть, схема ??? Я не знаю. Иногда ответ не то, что вы хотите услышать.

Ссылка: окончательная XML схема Priscilla Walmsley, 2-е издание, стр. 378-379.

Вот отличный пост Вопросы бесчисленного времени, такие как это, были заданы вопрос о проверке XML. Новые дополнения в схеме 1.1 очень ограничены по объему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top