Обычно атрибуты разрешены, только если сложный тип специально определен для разрешения требуемых атрибутов. С другой стороны, обычно <xs:anyAttribute>
используется только тогда, когда вы хотите разрешить любые атрибуты (возможно, с ограничениями пространства имен) в этом сложном типе.
Я вижу, что этот вопрос можно интерпретировать двумя различными способами
- Есть ли способ использовать
<xs:anyAttribute>
, но фактически разрешать только определенные виды атрибутов
- Есть ли способ использовать
<xs:anyAttribute>
, но запретить один определенный атрибут
На самом деле у меня нет хороших ответов, у меня есть только непроверенные хаки.
Дело № 1
Этого можно достичь, используя атрибут namespace
в <xs:anyAttribute>
. Значение по умолчанию для namespace
равно ##any
, что позволяет использовать атрибуты из любого пространства имен или без пространства имен. Вместо ## любой вы можете использовать либо
##other
, который допускает любой атрибут пространства имен, но не атрибут, принадлежащий целевому пространству имен схемы
или
- список разделенных пробелами URI разрешенных пространств имен. Этот список также может содержать подстановочные знаки
##targetNamespace
(что позволяет атрибуты из целевого пространства имен схемы) и ##local
(что позволяет атрибуты без пространства имен)
Запрет только атрибутов без пространства имен не представляется возможным.
Если схема имеет целевое пространство имен, то все глобально определенные атрибуты принадлежат этому целевому пространству имен. Таким образом, пример w3schools на самом деле кажется неверным, поскольку они определили атрибут gender
глобально в схеме с целевым пространством имен, но использовали его без префикса пространства имен (пространство имен по умолчанию не применяется к атрибутам).
Дело № 2
Это может быть достигнуто с <xs:attribute name="gender" use="prohibited"/>
. Атрибуты с use="prohibited"
не могут быть включены. Однако я никогда не исследовал, разрешено ли использовать такое определение атрибута, когда присутствует элемент <xs:anyAttribute>
. Атрибут use
недопустим в определениях глобальных атрибутов, поэтому глобальное запрещение использования атрибута таким образом невозможно.