Разрешение дополнительных атрибутов с Relax NG
Я пишу схему Relax NG для проверки некоторых файлов XML. Для большинства элементов есть некоторые обязательные атрибуты, и экземпляры этой схемы XML также могут добавлять любые дополнительные атрибуты.
Например, вот правильный документ:
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:param="some-uri#params">
<someElement
param:requiredAttribute1="foo"
param:requiredAttribute2="bar"
param:freeExtraParam="toto"
param:freeExtraParam="titi" />
</root>
В моей схеме Relax NG я выразил это следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="someElement" >
<attribute name="requiredAttribute1" />
<attribute name="requiredAttribute2" />
<!-- Any extra param -->
<zeroOrMore>
<attribute>
<nsName ns="some-uri#params" />
</attribute>
</zeroOrMore>
</element>
</start>
</grammar>
Однако, когда я пытаюсь проверить свой документ с помощью jing, он жалуется, что моя схема недействительна:
error: duplicate attribute "requiredAttribute1" from namespace "some-uri#params"
Я думаю, это потому, что requiredAttribute1 также соответствует правилу "любые атрибуты". Как правильно это сделать?
Заранее спасибо Рафаэль
1 ответ
Один первый момент: start
Элемент - это место для определения корневых элементов XML. Невозможно иметь атрибут в этом стартовом элементе.
Относительно ваших атрибутов: следующая схема, с использованием except
должен быть ответом для вас:
<grammar
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="root">
<ref name="someElement"/>
</element>
</start>
<define name="someElement">
<element name="someElement">
<zeroOrMore>
<attribute ns="some-uri#params">
<anyName>
<except>
<name>requiredAttribute1</name>
<name>requiredAttribute2</name>
</except>
</anyName>
</attribute>
</zeroOrMore>
<attribute ns="some-uri#params" name="requiredAttribute1"/>
<attribute ns="some-uri#params" name="requiredAttribute2"/>
</element>
</define>
</grammar>