1

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

<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|$(.*)"/>

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

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

4

1 回答 1

0

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

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

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

<animal name="dog"/>

和仓鼠

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

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

于 2012-08-23T22:42:53.703 回答