我有一个名为'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 !"
如果不使用模式,有没有办法做到这一点?
答案 0 :(得分:1)
Relax NG对于如何定义简单类型没有特别规定;它被设计为能够使用简单类型库来制定这样的规则。所以原则上,是的,你可以在Relax NG中做你喜欢的事情:只需使用一个简单的类型库来提供你所寻求的功能。
实际上,您似乎正在使用简单类型的XSD库。虽然XSD允许定义其值是其他简单值序列的列表类型,但为了简化定义和验证器,XSD列表值被白色空间上的解析器破坏; XSD不允许值的任意分隔符。所以,使用Relax NG基于XSD的简单类型库,你不能做你想做的事。