我有一个相对较大的代码库,其中包含两种类型的 XML:
<tag ref="var_ref" />
或者
<tag>value</tag>
但是,我希望以下内容无法验证,因为在我们的情况下它是模棱两可的。
<tag ref="var_ref">value</tag>
我看到在 v1.1 中可以使用替代方案,但是有人对 XSD 1.0 有破解吗?
我有一个相对较大的代码库,其中包含两种类型的 XML:
<tag ref="var_ref" />
或者
<tag>value</tag>
但是,我希望以下内容无法验证,因为在我们的情况下它是模棱两可的。
<tag ref="var_ref">value</tag>
我看到在 v1.1 中可以使用替代方案,但是有人对 XSD 1.0 有破解吗?
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
。