2013-01-10 75 views
1

我的目標是擁有一個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 } 
} 

我想是描述文檔的架構,其中通過如果刻度線/ @從一個浮動,刻度線/刻度/ @值也必須是浮動。

所以基本上它應滿足以下測試:

VALID

<tickmarks from="1" to="10"> 
    <tick value="3" label="3"/> 
    <tick value="7" label="7"/> 
</tickmarks> 

VALID

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

+0

這不是你的目標更準確的措辭? 「*我的目標是制定一個模式,強制元素的屬性與該元素的父元素的另一個屬性具有相同的數據類型*」 – mzjn

回答

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 } 
} 
+0

Jing報告語法錯誤並缺少「開始」元素。 – mzjn

+0

修好了,謝謝。我還會更新問題以使用有效的模式(使用「start」元素)。 –