枚举列表包含空值的 XML 属性的 DTD 或 XSD

枚举列表包含空值的 XML 属性的 DTD 或 XSD

我的目标/问题是了解如何为 XML 创建 DTD 或 Schema,其中属性值的枚举可以包括 null 作为有效值。

W3C 规范XML 定义了属性有效性约束,其中一个是枚举。这是属性有效值的硬编码列表。例如:

<foo att="aaa" />

值“aaa”必须位于元素 foo 的有效属性列表中,或者该属性可能由 DTD 或 XSD 标记。

该列表可以在 !ATTLIST 的 DTD 中定义如下:

att ( aaa | bbb ) #IMPLIED

在 XSD 中它看起来像这样:

<xs:attribute name="att">
  <xs:simpleType>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="aaa" />
      <xs:enumeration value="bbb" />
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

现在,如果可以接受空值怎么办?我说的不是 #IMPLIED = 可选属性。我说的是空值与“aaa”或“bbb”一样有效的属性。以下 DTD 和 XSD 是不是有效的:

<!ATTLIST att ( | aaa | bbb ) #IMPLIED>

<xs:attribute default="" name="att">
  <xs:simpleType>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="" />
      <xs:enumeration value="aaa" />
      <xs:enumeration value="bbb" />
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

在这些示例中,att属性是可选的 (#IMPLIED),但如果存在,也应允许空值:att=""。XSD 更进一步指出,如果不存在该值,则其值将被赋为空。

此类属性的验证必须符合以下模式(摘自第 3.3.1 节,示例 [59]):

Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'

该正则表达式定义了“( aaa | bbb )”上方的 DTD 序列。在零个或一个空格“S?”之后,我们可以得到一个 Nmtoken,后面可以有另一个空格和管道,用于更多 Nmtoken。Nmtoken 定义在第2.3节以 NameStartChar 开头。不允许为空。NameStartChar 不能是引号或空字符串。

但在常见代码中,我们可以将枚举元素定义为空字符串,并且可以定义可空类型,包括枚举。更具体地说,在代码中,我们将字符串传递给方法,然后根据枚举进行验证。

我试图解决的问题/应用程序是关于如何在 DTD 和/或 XSD 中定义有效的 XML 语法,其中处理 XML 的代码可以接受空字符串。如果没有这个,XML 就不会被验证,att=""即使它是有效的。我们在乎吗?好吧,对于我现在正在使用的代码,我关心。

我们不要讨论枚举中空字符串的有效性、使用 enum.None、使用 method(Enum val) 而不是 method(String val) 等问题。事实上,此代码已经广为流传。它存在于常见的 FOSS 中,它可以工作,我们不会重写它。问题在于创建忠实定义代码的 XML。

有 XSD 语法可以定义属性的替代值。我会接受适用于此场景的模式。在我的直接项目中,我正在生成 DTD(Ant 任务 AntStructure)并将其转换为 XSD。DTD 无效,因此 XSD 也无效。我想使用 DTD 来做到这一点,但这并不重要。

答案1

在 XSD 中,只需将类型定义为 的限制,xs:string而不是xs:NMTOKEN。该类型xs:NMTOKEN不允许零长度字符串,因此如果您想要零长度字符串,那么它就不能是xs:NMTOKEN

(不确定 DTD 中的等效内容是什么,已经过去很长时间了……)

相关内容