在不使用模式的情况下制作复杂的Relax NG属性?

时间:2013-02-16 03:16:15

标签: relaxng relaxng-compact

我有一个名为'page'的属性。它由两到三个双打组成,用逗号分隔,而不是空格,带有可选的'!'在末尾。以下所有内容均有效:

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 )?, ("!")? }

我可以使用'list'进行上述工作:

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

然后我最终得到每个部分之间的空格:

page="8.5 , 11 !"

如果不使用模式,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

Relax NG对于如何定义简单类型没有特别规定;它被设计为能够使用简单类型库来制定这样的规则。所以原则上,是的,你可以在Relax NG中做你喜欢的事情:只需使用一个简单的类型库来提供你所寻求的功能。

实际上,您似乎正在使用简单类型的XSD库。虽然XSD允许定义其值是其他简单值序列的列表类型,但为了简化定义和验证器,XSD列表值被白色空间上的解析器破坏; XSD不允许值的任意分隔符。所以,使用Relax NG基于XSD的简单类型库,你不能做你想做的事。

相关问题