Условный тип данных RELAX NG на основе другого элемента
Моя цель - создать компактную схему RELAX NG, которая обеспечивает соответствие типа данных элемента типу данных родительского элемента.
В настоящее время у меня есть следующая схема:
start = Tickmarks
Tickmarks = element tickmarks {
attribute from { xsd:float | xsd:date },
attribute to { xsd:float | xsd:date },
Tick*
}
Tick = element tick {
attribute value { xsd:float | xsd:date },
attribute label { text }
}
То, что я хотел бы, является схемой, которая описывает документ, где, если Tickmarks/@from является float, значение Tickmarks/Tick/@ также должно быть float.
Поэтому, по сути, он должен удовлетворять следующим критериям:
ДЕЙСТВУЕТ
<tickmarks from="1" to="10">
<tick value="3" label="3"/>
<tick value="7" label="7"/>
</tickmarks>
ДЕЙСТВУЕТ
<tickmarks from="2000-01-01" to="2006-01-01">
<tick value="2002-01-01" label="2002"/>
<tick value="2004-01-01" label="2004"/>
</tickmarks>
НЕДЕЙСТВИТЕЛЬНЫМ
<tickmarks from="2000-01-01" to="2006-01-01">
<tick value="10" label="10"/>
<tick value="20" label="20"/>
</tickmarks>
НЕДЕЙСТВИТЕЛЬНЫМ
<tickmarks from="1" to="10">
<tick value="2002-01-01" label="2002"/>
<tick value="2004-01-01" label="2004"/>
</tickmarks>
Возможно ли это с RELAX NG compact?
1 ответ
Решение
Если вы хотите остаться с чистой RELAX NG (и избегать альтернативных решений, таких как встроенные правила Schematron), вы можете использовать:
start = Tickmarks
Tickmarks = element tickmarks {
(
attribute from { xsd:float },
attribute to { xsd:float },
Tick-float*)
| (
attribute from { xsd:date },
attribute to { xsd:date },
Tick-date*)
}
Tick-float = element tick {
attribute value { xsd:float },
attribute label { text }
}
Tick-date = element tick {
attribute value { xsd:date },
attribute label { text }
}