【问题标题】:Relax NG and uniqueness of elements/attributes放松 NG 和元素/属性的唯一性
【发布时间】:2014-05-25 06:39:53
【问题描述】:

是否可以让 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 的文章。但还有其他可能吗?

【问题讨论】:

    标签: xml schema


    【解决方案1】:

    不,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 之间的区别在元素名称中表示,并且内容模型可以强制它们的唯一性;这不一定是可能的

    【讨论】:

      【解决方案2】:

      您的架构片段按原样正常。

      架构:

      t1t2t3选择> 属性> 元素>

      允许属性 test 具有“t1”、“t2”或“t3”的值。如果它包含其他任何内容,RELAX NG 验证器将发出验证错误消息。例如在这种情况下jing 报告

      "[Jing] 属性“test”的值无效;必须等于“t1”、“t2”或“t3”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多