如何在Relax NG中定义自己的类型?

时间:2011-07-18 09:29:07

标签: xml regex types xsd relaxng

考虑以下正则表达式

pattern = "(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])/(19|20)\d\d"

此pattertn表示MM / DD / YYYY格式的日期字符串。现在,如果我想创建这种类型的几个属性,我显然可以写出:

element holiday 
{
 attribute beginDate
 {
  xs:string { pattern = "(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])/(19|20)\d\d" }
 }
 attribute endDate
 {
  xs:string { pattern = "(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])/(19|20)\d\d" }
 }
}

但是,每当我想以这种格式定义日期时,编写模式行非常不方便。我想定义自己的类型,例如MyDateFormat,并在必要时将其用作attribute someDate { MyDateFormat },而不是多次重写相同的代码,但我找不到使用Relax NG compact syntax定义自己类型的方法。我的问题是如何实现这样的行为并避免代码重写两次。

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

找到一个解决方案:新类型可以定义为

MMDDYYYY = xs:string { pattern = "(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])/(19|20)\d\d" }

然后在必要时使用它:

element holiday 
{
 attribute beginDate { MMDDYYYY }
 attribute endDate   { MMDDYYYY }
}