【问题标题】:XSD restrictionsXSD 限制
【发布时间】:2009-08-07 09:00:11
【问题描述】:

是否可以使用 XSD 将节点名称限制为枚举,然后基于此枚举添加另一个限制?

例如,我有这个 xml:

<a>
    <b name="string" value="hello">
    <b name="integer" value="123">
</a>

我希望“b”节点具有来自枚举 {“string”、“integer”} 的名称属性。 然后,如果它是“字符串”,我希望该“值”属性是 xs:string 的类型, 如果它是“整数”,我希望“值”属性是 xs:integer 的类型。

【问题讨论】:

    标签: xml xsd restriction


    【解决方案1】:

    没有。您不能在 XSD 中执行此操作。本质上,您有 2 个不同类型的 。这违反了Element Consistency rule

    你有几个选择,

    1. 在您的应用程序中执行架构之外的规则。这就是我要做的。
    2. 使用其他人提到的 Schematron 等验证语言。
    3. 切换到更强大的架构语言,例如Relax NG

    【讨论】:

    • 和我想的一样。谢谢你的回答。
    【解决方案2】:

    你可以做一定的限制,例如您可以限制 name 属性的值来自给定列表 - 但您不能在 XML 模式中表达“如果名称是字符串,则值的类型必须是 xs:string”之间的这种关系。

    您必须使用其他技术(例如Schematron),或者在您的应用代码中检查这一点。

    马克

    【讨论】:

    • 感谢您的回复。我会更接近 schematron。
    【解决方案3】:

    没有。但是您将 name 视为一种类型 - XML Schema 确实 对由字符串值确定的元素的complexType 有一些支持。但是,您必须在 XML 文档中使用属性名称“xsi:type”,所以它看起来像这样:

    <a>
        <b xsi:type="string" value="hello">
        <b xsi:type="integer" value="123">
    </a>
    

    恐怕这是 XML Schema 能做的最好的事情了。官方入门中的更多细节(不幸的是,这可能会让人很困惑): http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2011-01-24
      相关资源
      最近更新 更多