1

我的目标是拥有一个 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 是一个浮点数,那么 Tickmarks/Tick/@value 也必须是一个浮点数。

所以本质上它应该满足以下测试:

有效的

<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 是否可以做到这一点?

4

1 回答 1

3

如果您想继续使用纯 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 }
}
于 2013-01-10T12:24:12.780 回答