【问题标题】:xsd – can I restrict an attribute to a key OR enumeration?xsd – 我可以将属性限制为键或枚举吗?
【发布时间】:2017-02-16 10:18:53
【问题描述】:

我想允许 example.xml

<defs>
 <def n="a"/>
 <def n="b"/>
</defs>

<refer-to-def n="a"/>
<refer-to-def n="b"/>
<refer-to-def n="predefined"/>
<refer-to-def n="also-predefined"/>

s.t. //refer-to-def/@n 唯一可能的值是//def/@n OR "predefined" OR "also-predefined 给出的值。特别是,如果我添加了&lt;refer-to-def n="never-defined"/&gt;,它应该不再验证。

我可以使用

来做第一个限制
<xs:keyref name="defRef" refer="def">
  <xs:selector xpath=".//refer-to-def" />
  <xs:field xpath="@n" />
</xs:keyref>
<xs:key name="def">
  <xs:selector xpath="./defs/def" />
  <xs:field xpath="@n" />
</xs:key>

但如果 .xml 有 &lt;refer-to-def n="predefined"/&gt;,这当然会失败。

我可以通过定义&lt;def&gt;n 属性来实现第二个限制

  <xs:attribute name="n" use="required">
    <xs:simpleType>
      <xs:union>
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="predefined"/>
            <xs:enumeration value="also-predefined"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:union>
    </xs:simpleType>
    </xs:attribute>

但这当然不包括定义 n 值的动态列表。

如何将两者结合起来,这样 n 既可以来自动态列表,也可以来自预定义的集合,并且我的 example.xml 进行验证?

【问题讨论】:

    标签: xml validation xsd union keyref


    【解决方案1】:

    无法在 XSD 1.0 中完成。

    在 XSD 1.1 中,您可以使用断言做任何事情。

    【讨论】:

    猜你喜欢
    • 2012-03-26
    • 2017-06-29
    • 1970-01-01
    • 2012-08-10
    • 2017-03-30
    • 1970-01-01
    • 2020-10-02
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多