代码之家  ›  专栏  ›  技术社区  ›  ppiotrowicz

XSD限制

  •  0
  • ppiotrowicz  · 技术社区  · 15 年前

    是否可以使用xsd限制节点名到枚举,然后根据此枚举添加其他限制?

    在示例中,我有这个XML:

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

    我希望“b”节点具有枚举“string”、“integer”的name属性。 如果是“string”,我希望“value”属性是xs:string的类型, 如果它是“integer”,我希望“value”属性是xs:integer类型。

    3 回复  |  直到 15 年前
        1
  •  1
  •   ZZ Coder    15 年前

    不,在XSD中不能这样做。本质上,您有两个不同类型的<b>。这违反了 Element Consistency rule .

    你有几个选择,

    1. 在应用程序中,在架构外部强制执行规则。这就是我要做的。
    2. 使用像Schematron这样的验证语言,如其他人所提到的。
    3. 切换到更强大的模式语言,如 Relax NG .
        2
  •  1
  •   marc_s HarisH Sharma    15 年前

    您可以执行某些限制,例如您可以限制 name 属性来自给定的列表-但不能在XML架构中表示“如果名称是字符串,则值的类型必须是xs:string”之间的此类关系。

    你要么使用其他技术(比如 Schematron )或在应用程序代码中检查此项。

    马克

        3
  •  0
  •   13ren    15 年前

    不,但您将名称视为类型和XML模式 对…有一些支持 complexType 由字符串值确定的元素。但是,您必须在XML文档中使用属性名“xsi:type”,因此它看起来像这样:

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

    恐怕这是XML模式所能做的最好的工作。官方初级读物中的更多细节(不幸的是,这会让人非常困惑): http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs