2013-09-04 16 views
7

Con RelaxNG, posso verificare se il valore di un attributo è univoco all'interno di un elemento di inclusione?Come verificare che gli attributi siano unici con RelaxNG?

Ad esempio, questo castle dovrebbe convalidare:

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

ma questo non dovrebbe (duplicare porta stessa room):

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

sto usando RelaxNG (compatto). Non conosco i valori degli attributi "in anticipo", solo che dovrebbero essere unici all'interno di uno room.

Grazie!

risposta

6

Per quanto ne so, questo non può essere fatto in puro RELAX NG. È possibile utilizzare Schematron (incorporato), come abbiamo fatto per lo Citation Style Language schema. Se si prende questa strada, si noti che non tutti i validatori di RELAX NG analizzano Schematron e che anche il supporto per schemi Schematron autonomi è limitato. Per esempio. il popolare validatore XML Jing supporta solo la versione precedente di Schematron 1.5, non la più recente ISO Schematron.

Per il nostro progetto, in cui usiamo Jing, usiamo un script prima convertire il nostro schema RELAX NG Compact nel formato RELAX NG XML (con Trang), quindi estrarre le regole Schematron dallo schema RELAX XML NG in uno standalone Schematron schema (con Saxon e il foglio di stile XSLT RNG2Schtrn.xsl) e infine convalidare lo schema Schematron estratto con Jing.

Se questo non ti ha spaventato, ho messo insieme il seguente Schematron 1.5 schema per il vostro problema:

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

Quando eseguito sul seguente documento 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

Grazie per la risposta! Guarderò Schematron. –