【问题标题】:XML Schema TypesXML 模式类型
【发布时间】:2012-07-19 17:45:24
【问题描述】:

如果我有一个元素,动物:

<animal name="dog"/>

可以将以下内容作为 name 属性的值:

  • $(ANY_STRING)

其中 $(ANY_STRING) 是一个简单的名称、值替换,某些软件将在稍后执行和验证(ANY_STRING 实际上是任何字符串)。这个元素的 XML Schema 是什么样的?限制三个已知名称很容易:

  <xs:simpleType name="AnimalNames">
    <xs:restriction base="xs:string">
      <xs:enumeration value="dog"/>
      <xs:enumeration value="cat"/>
      <xs:enumeration value="bird"/>
    </xs:restriction>
  </xs:simpleType>

限制 $(ANY_STRING) 本身同样容易(使用 xs:pattern 来限制)。但是由于属性可能只是简单类型,是否可以指定该属性可能在枚举列表或 $(ANY_STRING) 值中?

我考虑过的另一个选项是限制以下模式:

<xs:pattern value="dog|cat|bird|$(.*)"/>

尽管随着可能值列表的增加,这变得非常糟糕。

当然,最简单的选择是只声明一个字符串类型,但我希望限制更多。

【问题讨论】:

  • 对不起,如果第四个选项是任何字符串,那么我真的看不出,通过明确说明三个值会得到什么,这三个值是明确包含的。我肯定会引入一个替代分支,因此您要么拥有一个预定义的动物,要么拥有一个包含具有任意值的动物的不同(元素/属性)。

标签: xsd


【解决方案1】:

定义像这样的半封闭列表的一种方法是,使用一组为文档明确指定的众所周知的值,然后使用转义影线来允许其他字符串,是使用联合定义您的属性您的 AnimalNames 类型和 xs:NMTOKEN 或 xs:Name(或任何内置或用户定义的类型最能捕捉您对未枚举的其他名称的约束)。

正如 guidot 在他的评论中指出的那样,这样的联合接受与其最具包容性的成员类型相同的一组值,因此对于其唯一目的是看门人的模式来说,它是没有意义的。该技术对于文档和类型驱动的调度很有用(如果验证成员类型是AnimalNames do X else do Y)。

为了适应不提供有关哪种成员类型验证联合类型的特定值的信息的架构验证器,一些词汇表设计者按照 guidot 的建议进行操作,并提供两种元素类型,一种用于已知/预测/预期动物名称和其他名称。或者他们将AnimalNames 类型指定为接受字符串dogcatbirdother,将属性name 定义为具有AnimalNames 类型,并定义另一个属性(称为@ 987654330@) 被定义为当且仅当name="other" 时才有意义。所以狗是用

来描述的
<animal name="dog"/>

还有仓鼠

<animal name="other" other-name="hamster"/>

这使得在接受其他名称的同时特别处理众所周知的名称变得相当简单。

【讨论】:

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