Как ограничить родительский атрибут по атрибуту? - PullRequest
0 голосов
/ 03 сентября 2010

Взгляните на этот пример .

Теперь в attribute.xsd определен атрибут пола. Но, насколько я понимаю, я могу использовать этот атрибут везде, где у family.xsd есть anyAttribute.

Можно ли ограничить гендерный атрибут определенным родителем по имени родителя?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2010

Обычно атрибуты разрешены, только если сложный тип специально определен для разрешения требуемых атрибутов. С другой стороны, обычно <xs:anyAttribute> используется только тогда, когда вы хотите разрешить любые атрибуты (возможно, с ограничениями пространства имен) в этом сложном типе.

Я вижу, что этот вопрос можно интерпретировать двумя различными способами

  1. Есть ли способ использовать <xs:anyAttribute>, но фактически разрешать только определенные виды атрибутов
  2. Есть ли способ использовать <xs:anyAttribute>, но запретить один определенный атрибут

На самом деле у меня нет хороших ответов, у меня есть только непроверенные хаки.

Дело № 1

Этого можно достичь, используя атрибут namespace в <xs:anyAttribute>. Значение по умолчанию для namespace равно ##any, что позволяет использовать атрибуты из любого пространства имен или без пространства имен. Вместо ## любой вы можете использовать либо

  1. ##other, который допускает любой атрибут пространства имен, но не атрибут, принадлежащий целевому пространству имен схемы
    или
  2. список разделенных пробелами URI разрешенных пространств имен. Этот список также может содержать подстановочные знаки ##targetNamespace (что позволяет атрибуты из целевого пространства имен схемы) и ##local (что позволяет атрибуты без пространства имен)

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

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

Дело № 2

Это может быть достигнуто с <xs:attribute name="gender" use="prohibited"/>. Атрибуты с use="prohibited" не могут быть включены. Однако я никогда не исследовал, разрешено ли использовать такое определение атрибута, когда присутствует элемент <xs:anyAttribute>. Атрибут use недопустим в определениях глобальных атрибутов, поэтому глобальное запрещение использования атрибута таким образом невозможно.

0 голосов
/ 29 сентября 2010

Я решил это, используя <xs:redefine>, который позволяет вам переопределять типы и группы.

0 голосов
/ 03 сентября 2010

Мои знания XML-технологий довольно кратки, так что примите это с щепоткой соли.

Вы можете использовать пол (мужской | женский) вместо других атрибутов, так как это будет синтаксически правильный XML.

Однако, если вы проверяете, является ли ваш XML корректным и правильно сформированным, вам нужно написать DTD или, предпочтительно, документ схемы, чтобы проверить, где можно использовать атрибут пола

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