2015-09-03 2 views
0

Для ниже XSD я хочу добиться зависимости между элементами на разных глубинах. Как изменить эту схему для достижения следующей проверки для моего XML:Схема XSD - как создать зависимость между элементами на разных уровнях

  • Если элемент «Info» не присутствует в XML, то элемент «Value» должен присутствовать для каждого "ObjectData «
  • Если элемент с именем» Значение «не указан в XML для одного или нескольких» ObjectData «элементов, чем элемент с именем» Info "должен присутствовать

    <xs:element name="Objects" minOccurs="0" maxOccurs="1" > 
         <xs:complexType> 
          <xs:all> 
           <xs:element name="Info" type="Info" minOccurs="0" maxOccurs="1"/> 
           <xs:element name="ObjectData" minOccurs="1" maxOccurs="unbounded"> 
            <xs:complexType> 
             <xs:all> 
              <xs:element name="ObjType" type="ObjTypeEnum" /> 
              <xs:element name="Value" type="xs:decimal" minOccurs="0" maxOccurs="1"/> 
              <xs:element name="Prop" type="properties" /> 
             </xs:all> 
            </xs:complexType> 
           </xs:element> 
          </xs:all> 
         </xs:complexType> 
        </xs:element> 
    

Другой способ понять выше два требования это,

if(Objects.Info.occurs == 0) 
    For-each Objectdata in Objects 
     assert(ObjectData.Value.occurs == 1) 

For-atleast-one ObjectData in Objects 
    if (ObjectData.Value.occurs == 0) 
     assert(Objects.Info.occurs == 1) 
+0

Можете ли вы использовать XML-схему 1.1 или Schematron? Если вы не знаете, используйте элемент 'xs: assert' в XSD для тестирования XSD 1.1 или скажите, какой инструмент вы используете для проверки. –

+0

У меня нет понимания xs :: assert или schmeatron. Как это сделать? – nurabha

+0

Затем, как я сказал, расскажите, какой инструмент и его версию вы используете для проверки. Неявный тест заключается в том, чтобы положить, например, '' в одном из определений вашего типа. –

ответ

1

Mathias Я использую этот онлайн freeformatter.com/xml-validator-xsd.html инструмент. Я думаю, его XSD 1.0. Мне придется посмотреть на функцию xs: assert. XSD 1.1 новичок ко мне

Да, онлайн-валидатор freeformatter поддерживает только XML Schema 1.0. Я проверил это, отправив документ XSD, содержащий <xsd:assert test="true()" /> в определении типа. В результате:

S4s-elt-invalid-content.1: The Content Of '#AnonType_list' Is Invalid. 
Element 'assert' Is Invalid, Misplaced, Or Occurs Too Often. 

Это актуально в вашем случае, потому что единственный способ представления ограничений зависимостей, как x if y and z, otherwise not(x) являются утверждения. К сожалению, утверждения - это функция, которая является эксклюзивной для XML-схемы 1.1.

Итак, нет, если вы не можете использовать другой инструмент/механизм проверки XSD 1.1 для проверки, это невозможно.

Если вы можете использовать движок типа Xerces или Saxon-EE, я рад подробно остановиться на решении утверждений в XSD 1.1. Альтернативно, те же правила могут быть написаны на Schematron, другом языке схемы.

+0

Собственно, проверка выполняется в моем коде на языке C++. Он не использует XSD-файл, но код написан в соответствии с схемой в XSD. Причина, по которой у меня есть файл xsd, заключается в том, чтобы убедиться, что при создании xml он компилируется с помощью xsd, прежде чем загружать его в моем приложении на C++. Я использую PUGI для синтаксического анализа xml dom. Я предполагаю, что у PUGI нет какой-либо возможности для проверки XML от xsd – nurabha

+0

@nurabha Я согласен, pugixml, скорее всего, не поддерживает проверку. Тогда ваши единственные варианты: 1) обойтись без ваших динамических правил или 2) загрузить XML в C++-скрипт, а затем использовать код C++ для утверждения правил, которые вы имеете в виду, например. с помощью выражений XPath. Я уверен, pugixml может обрабатывать выражения XPath. –

+0

Herr Müller, Спасибо за отзыв и помощь. Я сделаю необходимое – nurabha

Смежные вопросы