使用ANY和必需元素声明DTD元素

时间:2016-04-19 14:55:02

标签: xml xsd dtd xsd-validation xml-dtd

我想在DTD中描述一个元素 MYELEMENT ,它必须由 elementA elementB 任何其他元素。为此我尝试了语法:

<!ELEMENT MYELEMENT (elementA | elementB | ANY)*>

但是当elementA或elementB以外的元素出现时,这不起作用。有人可以帮助DTD使用正确的语法吗?

可以使用XSD架构完成吗?

此致

1 个答案:

答案 0 :(得分:0)

当你说“MYELEMENT ......必须由elementA,elementB和任何其他元素组成”时,你的意思是

  • (A)MYELEMENT的出现可能有零个或多个孩子;每个孩子可能被命名为elementAelementB或其他任何内容。

  • (B)每次出现的MYELEMENT都应至少有一个名为elementA的孩子,至少有一个名为elementB的孩子,并且可能还有其他孩子。

  • (C)每次出现的MYELEMENT都应该只有一个名为elementA的孩子,一个名为elementB的孩子,任何一个顺序,也可能有其他孩子。

如果在DTD中关键字ANY是一种通配符,它​​匹配任何元素而不管名称,那么您显示的内容模型将匹配可能性(A)。但是,这不是关键字的含义,因此您显示的声明并不能达到您想要的效果:您提供的声明只是意味着任何MYELEMENT的出现都可能包含零个或多个元素,只要MYELEMENT的每个子节点都被命名为elementAelementBANY

如果(A)是您想要的,则根本不需要指定elementAelementB;你需要的只是一个匹配任何元素的通配符。 DTD没有这样的通配符,但如果您不介意允许字符数据以及子元素,则声明

<!ELEMENT MYELEMENT ANY >

接近你的规格。在XSD中,您将使用xsd:any通配符。

如果你想要的是(B)或(C),那么XSD 1.0可以接近;您可以使用带有namespace="##other"的通配符来允许您命名的元素以及不同命名空间中的任何元素。

如果订单没有任何意义,如果指定任意序列,您会发现内容模型更容易指定。 (当传递信息时,变量序列是必要的;当它不传达信息时,它只会使生活变得复杂并打开一个隐蔽的通道。)