1

我有一个相对较大的代码库,其中包含两种类型的 XML:

<tag ref="var_ref" />

或者

<tag>value</tag>

但是,我希望以下内容无法验证,因为在我们的情况下它是模棱两可的。

<tag ref="var_ref">value</tag>

我看到在 v1.1 中可以使用替代方案,但是有人对 XSD 1.0 有破解吗?

4

1 回答 1

1

1.0 最简单的破解方法是为这两种不同的验证行为赋予不同的名称。(一些权威人士会说这不是一个hack,而只是更简单的设计。为什么要给两个结构如此明显不同的东西取同一个名字?称它们是什么:当它们不同时,称它们为不同的东西。它使许多事情更简单,包括 XML 和 XML 处理。)

如果您的目标命名空间绑定到 prefix tns,您可以编写:

<xsd:element name="tns:TAG" abstract="true"/>
<xsd:element name="tag" type="xsd:string" 
             substitutionGroup="tns:TAG"/>
<xsd:element name="tagref" 
             substitutionGroup="tns:TAG">
  <xsd:sequence/>
  <xsd:attribute name="ref" type="xsd:IDREF"/>
  <!--* or adjust the type to suit ... *-->
</xsd:element>

然后将tns:tag现有内容模型中对 的所有引用替换为对 的引用tns:TAG

于 2013-06-03T16:16:31.540 回答