Как определить элементы с любым именем, но применить определенные атрибуты?

#xsd

#xsd

Вопрос:

У меня есть XML, который содержит такое определение:

 <addr15 type="binary" size="1" data_characters="0,1,0,1">text 15</addr15>
<addr14 type="binary" size="1" data_characters="0,1,0,1">text 14</addr14>
<addr13 type="binary" size="1" data_characters="0,1,0,1">text 13</addr13>
<addr12 type="binary" size="1" data_characters="0,1,0,1">text 12</addr12>
<addr11 type="binary" size="1" data_characters="0,1,0,1">text 11</addr11>
 

Поскольку имена элементов определяются пользователем (любая допустимая строка в порядке), атрибуты являются обязательными.

Как я могу определить XSD для проверки этого?

Использование <xsd:any> не выполнит задание — оно не сможет проверить атрибуты. Установите processContents значение lax или strict также не будет выполнять эту работу, поскольку я не могу предоставить необходимые инструкции XSD для проверки.

Ответ №1:

имена элементов определяются пользователем (любая допустимая строка в порядке) XSD в основном описывает имена тегов в документе и то, как их можно корректно комбинировать. Так что этот формат XML будет сложно описать с помощью XSD.

Параметры (в порядке моих предпочтений):

  1. Измените имя тега на <addr> и определите новый обязательный атрибут ‘addrNumber’ для хранения 11,12,13,14,15. Это было бы легко описать с помощью XSD.
  2. Предварительно объявите все разрешенные <addrNN> имена тегов как глобальные элементы в вашем XSD. Запретить любые имена тегов, которые предварительно не объявлены в XSD (опытные пользователи могут добавлять свои собственные объявления в XSD)
  3. Продолжайте разрешать определяемые пользователем имена тегов. Определите глобальный сложный тип с простым содержимым, который описывает атрибуты и значение тега. Каждый пользовательский <addrNN> тег должен включать атрибут xsi:type, который указывает на этот глобальный тип. Я думаю, для этого потребуется xsd:any с processContents=’strict’, чтобы гарантировать, что атрибут xsi:type будет строго проверен.

Я не буду вдаваться в подробности по каждому варианту, но я могу предоставить дополнительные подробности, если они вам понадобятся.

Комментарии:

1. Спасибо за ответ, опции 1 и 2 недопустимы, поскольку «addr» — это всего лишь пример, поддерживается любая строка (пользователь определяет имя элемента). По состоянию на вариант 3 — если пользователь не будет указывать «xsi: type» в своем XML, то принудительного применения не произойдет, верно? в таком случае мне здесь нечего делать… проверка зависит от того, сотрудничает ли пользователь

2. Если вы хотите выполнить проверку XSD, то неразумно разрешать пользователям выбирать свои собственные имена тегов. Если вы не можете принудительно использовать xsi:type, то проверка необязательна и на усмотрение пользователя. Я изо всех сил пытаюсь понять смысл даже попытки создать XSD на данный момент.

3. ну, пользователь определяет «переменные» для последующего использования в предоставленном уравнении. каждая «переменная» имеет пользовательское имя (имя элемента XML) с определенным атрибутом (определением) — поэтому каждая переменная define должна соответствовать определенному формату, в то время как ее имя является произвольным.