首页 文章

XSD限制

提问于
浏览
0

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

在示例中,我有这个xml:

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

我希望“b”节点具有枚举{“string”,“integer”}的name属性 . 然后,如果它是“字符串”,我希望“value”属性是xs:string的类型,如果它是“整数”,我希望“value”属性是xs:integer的类型 .

3 回答

  • 1

    不可以 . 您不能在XSD中执行此操作 . 从本质上讲,你有2个不同类型的b . 这违反了Element Consistency rule .

    你有几个选择,

    • 在应用程序中强制执行架构之外的规则 . 这就是我要做的 .

    • 使用Schematron等验证语言,如其他人所述 .

    • 切换到更强大的模式语言,如Relax NG .

  • 1

    你可以做一定的限制,例如您可以限制 name 属性的值来自给定列表 - 但您无法在XML架构中的"if name is string, then the type of value must be xs:string"之间表达这种关系 .

    您必须使用其他技术(如Schematron),或在您的应用代码中进行检查 .

  • 0

    不 . 但是您将名称视为类型 - 而XML Schema确实支持由字符串值确定的元素的 complexType . 但是,您必须在XML文档中使用属性名称"xsi:type",因此它看起来像这样:

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

    那个's the best that XML Schema can do I'恐怕 . 官方入门书中的更多细节(不幸的是,这可能非常令人困惑):http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs

相关问题