2017-02-22 59 views
1

Я имею следовать XSD файл схемы:XSD Уникальный Constraint элементов в различных последовательностях

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> 
    <xsd:element name="Config"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Modul"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element maxOccurs="unbounded" name="Content1"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element maxOccurs="unbounded" name="Content2"> 
         <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="AttributeType1"> 
          <xsd:complexType> 
           <xsd:attribute name="X" type="xsd:double" use="required" /> 
          </xsd:complexType> 
          </xsd:element> 
          <xsd:element name="AttributeType1"> 
          <xsd:complexType> 
           <xsd:attribute name="X" type="xsd:double" use="required" /> 
          </xsd:complexType> 
          </xsd:element> 
         </xsd:sequence> 
         <xsd:attribute name="Name" type="xsd:string" use="required" /> 
         </xsd:complexType> 
        </xsd:element> 
        </xsd:sequence> 
        <xsd:attribute name="Name" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       <xsd:unique name="Content2NameUniqueKey"> 
        <xsd:selector xpath="Content2" /> 
        <xsd:field xpath="@Name" /> 
       </xsd:unique> 
       </xsd:element> 
      </xsd:sequence> 
      <xsd:attribute name="Name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
      <xsd:unique name="Content1NameUniqueKey"> 
      <xsd:selector xpath="Content1" /> 
      <xsd:field xpath="@Name" /> 
      </xsd:unique> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xs:schema> 

С уникальными ограничениями, я могу проверить, если Content1 имя уникально, и если все Content2 являются unuique имени была в Content1 элемент.

Но моя проблема ist, я хочу проверить, уникальны ли все элементы content2 во всех элементах content1. Поэтому в полном XML-файле может быть только один элемент content1 с именем «xy».

Не могли бы вы помочь мне?

Многие поздравления всем!

ответ

1

Уникальный элемент для Content2 следует просто перемещать на один уровень выше в Modul, с XPath Content1/Content2. Таким образом, элементы Content2 также должны быть уникальными в течение всего Modul.

Существует еще одна проблема с двойным вхождением AttributeType1, которую я заменил min/maxOccurs=2, но это может быть просто опечатка.

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> 
    <xsd:element name="Config"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Modul"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element maxOccurs="unbounded" name="Content1"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element maxOccurs="unbounded" name="Content2"> 
         <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="AttributeType1" maxOccurs="2" minOccurs="2"> 
          <xsd:complexType> 
           <xsd:attribute name="X" type="xsd:double" use="required" /> 
          </xsd:complexType> 
          </xsd:element> 
         </xsd:sequence> 
         <xsd:attribute name="Name" type="xsd:string" use="required" /> 
         </xsd:complexType> 
        </xsd:element> 
        </xsd:sequence> 
        <xsd:attribute name="Name" type="xsd:string" use="required" /> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      <xsd:attribute name="Name" type="xsd:string" use="required" /> 
      </xsd:complexType> 
      <xsd:unique name="Content1NameUniqueKey"> 
      <xsd:selector xpath="Content1" /> 
      <xsd:field xpath="@Name" /> 
      </xsd:unique> 
      <xsd:unique name="Content2NameUniqueKey"> 
      <xsd:selector xpath="Content1/Content2" /> 
      <xsd:field xpath="@Name" /> 
      </xsd:unique> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xs:schema> 
+0

Thank's! Первое решение работает очень хорошо. – MrPink

+0

@MrPink: Пожалуйста, [** accept **] (http://meta.stackoverflow.com/q/5234/234215) этот ответ, если это поможет. Благодарю. – kjhughes