Могу ли я сделать атрибут XML обязательным через XSLT в зависимости от значения другого атрибута? - PullRequest
0 голосов
/ 13 сентября 2018

[Отредактировано]

Мои знания в xsd / xslt очень ограничены, так что простите, если мой вопрос очень прост или как-то неясен.Я думаю, что моя потребность является основной, но я могу быть перепутан с терминами, так как не смог найти связанных или близких ответов.

В моем файле .xsd есть следующая структура:

<xs:element name="someelement">
  ...
  <xs:attribute name="attr1" type="xs:NCName"/>
  ...
  <xs:attribute name="attr2" type="xs:NCName"/>
  ...

Я знаю, что в .xsd я могу установить use = "Required", чтобы сделать атрибут обязательным.(под обязательным я имею в виду, если проверка не пройдена)

Но в моем случае значение "attr1" должно быть обязательным, только если значение "attr2" имеет определенное значение.

Можно ли это сделать?(в файле .xsd или .xslt?)

Я хочу выполнить это поведение:

if element is “someelement” and attribute "attr2" equal "somevalue" then set use="Required" for "attr1" else "attr1" should not be mandatory

1 Ответ

0 голосов
/ 13 сентября 2018

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

Если вы хотите использовать определяемый пользователем атрибут, такой как ваш xsitype, который не имеет особого значения для обработчика схемы, тогда можно добиться этого с помощью условного присвоения типа (он же xs: alternative), для которого требуется процессор XSD 1.1.

ОБНОВЛЕНИЕ (ОБРАЩЕНИЕ С ПЕРЕСМОТРЕННЫМ ВОПРОСОМ)

Вы не можете достичь этого в XSD 1.0. Это можно сделать в XSD 1.1, используя условное присвоение типа (иначе xs: alternative). Вы определяете два типа: typeA с attr1 необязательным и typeB с attr1 обязательным, а затем определяете тип someElement с помощью xs:alternative, поэтому он имеет typeA при @attr eq 'someValue' и typeB иначе. Обычно typeB будет определяться как ограничение typeA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...