2013-09-04 22 views
7

Z RelaxNG, czy mogę sprawdzić, czy wartość atrybutu jest unikalna w obrębie elementu otaczającego?Jak sprawdzić, czy atrybuty są unikalne w RelaxNG?

Na przykład ten castle powinny potwierdzić:

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

Ale to nie powinno (drzwi w tym samym room duplikat):

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

Używam RelaxNG (zwarty). Nie znam wartości atrybutów "z wyprzedzeniem", tyle że powinny one być unikalne w ramach room.

Dzięki!

Odpowiedz

6

Według mojej wiedzy nie można tego zrobić w czystym RELAX NG. Możesz użyć (osadzonego) Schematron, tak jak zrobiliśmy to dla Citation Style Language schema. Jeśli weźmiesz tę trasę, zwróć uwagę, że nie wszystkie walidatory RELAX NG analizują osadzone Schematron i że wsparcie dla samodzielnych schematów Schematron również jest ograniczone. Na przykład. popularny walidator XML Jing obsługuje tylko starszą wersję Schematron 1.5, a nie nowszą wersję Schematron ISO.

dla naszego projektu, w którym używamy Jing, używamy script najpierw przekształcić naszą RELAX schematu NG Compact do RELAX formacie NG XML (z Trang), a następnie wyodrębnić zasady Schematron z RELAX NG schematu XML do samodzielnego Schematron schematu (z Saxon i arkusz stylów XSLT RNG2Schtrn.xsl), a na koniec waliduj z wyodrębnionym schematem Schematron z Jing.

Jeśli to nie przeraziło cię, ja sklecony następujące Schematron 1.5 schemat dla swojego problemu:

<?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> 

Po uruchomieniu na poniższym dokumencie 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

Dzięki za odpowiedź! Zajrzę do Schematron. –