Условный тип данных 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 }
}
Другие вопросы по тегам