Ошибка: элемент 'assert' недействителен, расположен не на своем месте или встречается слишком часто

Я пробовал утверждать в XSD, и я получаю сообщение об ошибке

Элемент 'assert' является недопустимым, неуместным или встречается слишком часто.

Мой пример - приведенный ниже XML.

`<?xml version="1.0" encoding="utf-8"?>
<p:CustomerElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <recordCount>1234</recordCount>
  <Customer>
      <indicator>A</indicator>
      <test1>hdjfs</test1>
      <test2>idsfh</test2>
	  <test3>idsfh</test3>
	  <test4>idsfh</test4>
	  <test5>idsfh</test5>
	  <test6>idsfh</test6>
	  <test7>idsfh</test7>
	</Customer>
    <Customer>
      <indicator>D</indicator>
      <test1>abcd</test1>
	  <test3>jhf</test3>
    </Customer>
</p:CustomerElement>`

XSD, который я создал для этого,

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns="http://My.Schema.Namespace" 
           targetNamespace="http://My.Schema.Namespace"
		   xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
           elementFormDefault="qualified"
           vc:minVersion="1.1">>

  <xs:element name="customer">
    <xs:complexType>
	<xs:sequence>
      <xs:element name="indicator">
	<xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="A" />
            <xs:enumeration value="B" />
          </xs:restriction>
    </xs:simpleType>
	  </xs:element>
      <xs:choice>
        <xs:element name="test1" />
        <xs:element name="test2" />
		<xs:element name="test3" />
		<xs:element name="test4" />
		<xs:element name="test5" />
		<xs:element name="test6" />
		<xs:element name="test7" />
      </xs:choice>
	  </xs:sequence>
    <xs:assert test="if(indicator eq 'A') then test1 and test2 and test3 and test4 
						and test5 and test6 and test7
						else if(indicator eq 'B') then test1 and test3"/>
	</xs:complexType>
  </xs:element>
 </xs:schema>

Я проверяю приведенный выше xml с помощью XSD в валидаторе свободного формата.

Я предполагаю, что в синтаксисе assert есть несколько ошибок. Может ли кто-нибудь помочь с условием, которое я искал, и помочь мне также с синтаксисом, а также дайте мне знать, добавил ли я правильные ссылки, поддерживающие схему XSD 1.1.


person user10155558    schedule 01.08.2018    source источник
comment
@kjhughes Не могли бы вы помочь мне в этом случае.   -  person user10155558    schedule 01.08.2018


Ответы (1)


Чтобы решить проблемы с XSD:

  1. Изменять

       elementFormDefault="qualified"
       vc:minVersion="1.1">>
    

    to

       vc:minVersion="1.1">
    

    для устранения ложного атрибута > и дублированного атрибута elementFormDefault.

  2. Добавьте else false() в свой тест утверждений, чтобы он был правильно сформирован. А еще лучше переписать логический эквивалент без составной конструкции if-else.

  3. Используйте процессор XSD 1.1, если вы хотите использовать xs:assert. Freeformat.com поддерживает только XSD 1.0.

Правильно сформированный XSD

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns="http://My.Schema.Namespace" 
  targetNamespace="http://My.Schema.Namespace"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.1">

  <xs:element name="customer">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="indicator">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="A" />
              <xs:enumeration value="B" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:choice>
          <xs:element name="test1" />
          <xs:element name="test2" />
          <xs:element name="test3" />
          <xs:element name="test4" />
          <xs:element name="test5" />
          <xs:element name="test6" />
          <xs:element name="test7" />
        </xs:choice>
      </xs:sequence>
      <xs:assert test="if (indicator eq 'A') 
        then test1 and test2 and test3 and test4 and test5 and test6 and test7
        else if (indicator eq 'B') then test1 and test3 else false()"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

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

person kjhughes    schedule 01.08.2018
comment
Вероятно, вы имели в виду else false(), а не else false. Эффект, вероятно, будет таким же, но использование false вместо false() побудит людей использовать true для обозначения true()... - person Michael Kay; 02.08.2018
comment
@MichaelKay: Хороший улов. Исправлено. Благодарю вас! - person kjhughes; 02.08.2018
comment
@kjhughes Большое спасибо за решение! Можно ли как-то это оптимизировать? ‹xs:assert test=if (индикатор eq 'A'), затем test1 и test2, и test3, и test4, и test5, и test6, и test7 else if (индикатор eq 'B'), then test1 и test3 else false()/› Like вместо упоминая все столбцы, можем ли мы сделать его маленьким, так как в моем реальном случае у меня около 100 столбцов? - person user10155558; 06.08.2018
comment
Логика может быть переписана: импликации могут быть преобразованы в отрицание и дизъюнкции, булева алгебра может упростить и т. д. Однако вы не указали свою высокоуровневую цель, поэтому я не собираюсь гнаться за неверным концом XY- проблема. Поскольку я помог вам ответить на ваш опубликованный вопрос, сначала примите этот ответ. Затем задайте новый вопрос о том, как решить проблему со 100 столбцами, и убедитесь, что в новом вопросе четко сформулирована ваша основная цель. Спасибо. - person kjhughes; 06.08.2018
comment
@kjhughes эй, не могли бы вы помочь мне с этим. Вопрос Спасибо. - person user10155558; 07.08.2018