放松NG和元素/属性的独特性

时间:2011-04-05 09:13:08

标签: xml schema

是否可以使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的内容。但还有另一种可能吗?

2 个答案:

答案 0 :(得分:2)

不,Relax NG不支持唯一性约束和参照完整性约束。正如詹姆斯·克拉克在a paper on the design of Relax NG中所说:

  

RELAX NG TC花了相当多的时间考虑RELAX NG应该为强制执行身份(唯一性和交叉引用)约束提供哪些支持。最后,结论是身份约束更好地分成单独的规范。因此,RELAX NG本身不支持身份约束。

为了与XML DTD兼容,RelaxNG支持检查ID / IDREF约束。但这是最容易遇到处理器之间的不一致以及让新用户感到困惑的领域之一。

您的选择包括

  • 检查应用程序级别值的唯一性
  • 使用另一种模式语言(Schematron,DTD,XSD)来制定和实施这种约束(其中,Schematron在实践中最容易使用,作为在特定点补充RelaxNG但是将大部分工作留给RelaxNG的方法)
  • 重新调整XML,以便在元素名称中表示t1,t2和t3之间的区别,并且内容模型可以强制它们的唯一性;这不一定是可能的

答案 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"