2013-09-04 2 views
7

С RelaxNG могу ли я проверить, уникально ли значение атрибута внутри закрывающего элемента?Как проверить, что атрибуты уникальны с RelaxNG?

Например, это castle следует проверить:

<castle> 
    <room> 
    <door to="North" /> 
    <door to="South" /> 
    </room> 
    <room> 
    <door to="North" /> 
    </room> 
</castle> 

Но это не должно (дублировать дверь в одном room):

<castle> 
    <room> 
    <door to="Dungeon" /> 
    <door to="Dungeon" /> 
    </room> 
</castle> 

Я использую RelaxNG (компактный). Я не знаю значения атрибутов «раньше времени», только чтобы они были уникальными в пределах room.

Спасибо!

ответ

6

Насколько мне известно, это невозможно сделать в чистом RELAX NG. Вы можете использовать (встроенный) Schematron, как это было сделано для Citation Style Language schema. Если вы делаете этот маршрут, обратите внимание, что не все валидаторы RELAX NG анализируют встроенный Schematron, а также поддержка автономных схем Schematron также ограничена. Например. популярный Jing XML-валидатор поддерживает только более старую версию Schematron 1.5, а не новый ISO Schematron.

Для нашего проекта, где мы используем Jing, мы используем script сначала преобразовать нашу RELAX NG Compact схемы в RELAX формате NG XML (с Trang), а затем извлечь правила Schematron из RELAX NG схемы XML в автономный Схема Schematron (с Saxon и таблицей стилей XSLT RNG2Schtrn.xsl), и, наконец, подтвердите, что извлеченная схема Schematron с Jing.

Если это не пугает тебя, я починил следующий Schematron 1.5 схемы для вашей проблемы:

<?xml version="1.0" encoding="UTF-8"?> 
<sch:schema xmlns:sch="http://www.ascc.net/xml/schematron"> 
    <sch:pattern name="duplicateAttributeValues"> 
    <sch:rule context="//room/door[@to]"> 
     <sch:report test="preceding-sibling::door/@to = @to">Warning: @to values should be unique for a given room.</sch:report> 
    </sch:rule> 
    </sch:pattern> 
</sch:schema> 

При запуске на следующий документ XML,

<?xml version="1.0" encoding="utf-8"?> 
<castle> 
    <room> 
    <door to="North"/> 
    <door to="South"/> 
    <door to="West"/> 
    </room> 
    <room> 
    <door to="West"/> 
    <door to="North"/> 
    <door to="West"/> 
    </room> 
</castle> 

Jing will report

Error: Warning: @to values should be unique for a given room.
From line 11, column 5; to line 11, column 21
th"/>↩ <door to="West"/>↩ </r

+0

Спасибо за ваш ответ! Я посмотрю на Schematron. –

Смежные вопросы