2013-02-16 42 views
0

我有一個叫做'page'的屬性。它由兩到三個雙打組成,以逗號分隔,而不是空格,並帶有可選的'!'最後。下面所有的都是有效的:在不使用模式的情況下製作一個複雜的放鬆NG屬性?

page="8.5,11,3!" 
page="8.5,11.4,3.1" 
page="8.5,11!" 
page="8.5,2.1" 

我知道我可以使用的模式,下面將工作:

attribute page { xsd:string { pattern="[0-9]+(\.[0-9]+)?,[0-9]+(\.[0-9]+)(,[0-9]+(\.[0-9]+)?)?(!)?" } } 

但如果可能的話,我寧願使用這樣的:

attribute page { xsd:double, ",", xsd:double, (",", xsd:double)?, ("!")? } 

我可以讓工作的上述排序,採用「清單」:

attribute page { list { xsd:double, ",", xsd:double, (",", xsd:double)?, ("!")? } } 

但後來我結束了各構件之間的空間:

page="8.5 , 11 !" 

有沒有辦法做到這一點,而無需使用模式?

回答

1

放鬆NG對於如何定義簡單類型沒有特別的規定;它被設計成能夠使用製作這種規則的簡單類型庫。所以原則上,是的,你可以在Relax NG中做你喜歡的事情:只需使用一個簡單的類型庫來提供你尋求的功能。

實際上,您似乎正在使用簡單類型的XSD庫。雖然XSD確實允許定義其值爲其他簡單值序列的列表類型,但爲了簡化定義和驗證程序,XSD列表值在解析器的空白處被破壞; XSD不允許任意分隔符的值。所以,不,你不能做你說你想做的事,用Relax NG的基於XSD的簡單類型庫。

+0

所以,我找到或寫了一個類型庫?你有鏈接到類型庫的示例實現嗎? – EdwinW 2013-02-16 21:30:40

相關問題