是否可以使Relax NG元素/属性唯一?
例如属性:
<rng:attribute name="test">
<rng:ref name="options"/>
</rng:attribute>
引用:
<rng:define name="options">
<rng:choice>
<rng:value>t1</rng:value>
<rng:value>t2</rng:value>
<rng:value>t3</rng:value>
</rng:choice>
</rng:define>
现在我必须验证一个xml,它不应该两次使用其中一个“选项”。换句话说:在xml中不应该出现“t1”两次......
我读过一些关于schematron的内容。但还有另一种可能吗?
答案 0 :(得分:2)
不,Relax NG不支持唯一性约束和参照完整性约束。正如詹姆斯·克拉克在a paper on the design of Relax NG中所说:
RELAX NG TC花了相当多的时间考虑RELAX NG应该为强制执行身份(唯一性和交叉引用)约束提供哪些支持。最后,结论是身份约束更好地分成单独的规范。因此,RELAX NG本身不支持身份约束。
为了与XML DTD兼容,RelaxNG支持检查ID / IDREF约束。但这是最容易遇到处理器之间的不一致以及让新用户感到困惑的领域之一。
您的选择包括
答案 1 :(得分:0)
您的架构片段按原样正常。
架构:
<?xml version="1.0"?> <rng:element xmlns:rng="http://relaxng.org/ns/structure/1.0" name="doc"> <rng:attribute name="test"> <rng:choice> <rng:value>t1</rng:value> <rng:value>t2</rng:value> <rng:value>t3</rng:value> </rng:choice> </rng:attribute> </rng:element>
允许属性测试具有“t1”,“t2”或“t3”的值。如果它包含任何其他内容,则RELAX NG验证器将发出验证错误消息。例如,在这种情况下jing报告
"[Jing] value of attribute "test" is invalid; must be equal to "t1", "t2" or "t3"。