XSD:可以包含简单内容或元素上下文的复杂类型

时间:2012-03-05 15:55:58

标签: xml xsd complextype

我正在为一个相当复杂的XML文件格式编写XSD。在许多方面,XML可以包含实际的文字值或产生值的脚本。 (想想Excel:42=21+21

例如,要指定大小,写入以下任一项应该是有效的:

<size>42</size>
<size><script>2*21</script></size>

我的第一个想法是使用<choice>来允许size元素中的int或脚本。但是,我必须给字符串元素一个名称,导致像<size><value>42</value></size>这样笨拙的语法。由于文字的使用频率远远超过脚本,因此我不想夸大它们的语法。

如何在XSD中表达初始语法?

2 个答案:

答案 0 :(得分:4)

我认为有两个不错的选择。

  1. 在任何一种情况下,都不要在<size>内放置任何子元素。相反,您可以在size元素上设置'type'属性,向消费者指示它是文字还是脚本。
  2. 使用此处描述的两种技术之一(均基于在complexContent上使用'mixed = true'属性:XML Schema: Element that can contain elements or text?
  3. 要在这些选项之间进行选择,您可以将自己置于消费者应用程序之中,并决定最有可能获得此数据的方式。一般来说,我认为如果主要消费者是将XML解析为一次性集成任务的开发人员,那么选项一是最好的(因为输出和XSD都更简洁,在我看来更具可读性);如果你看到一个使用你的模式的XML工具,那么选项二可能会更好,因此如果要解析具体元素,它可能更容易做一些特殊的事情。最终,虽然我只是猜测你的用例是什么......

答案 1 :(得分:2)

在XSD 1.0中,如果您不想更改XML实例的设计,那么您唯一真正的选择就是将内容模型声明为混合内容。

在XSD 1.1中,您可以将其声明为混合内容,然后使用断言来表示该元素必须具有元素子元素或文本节点子元素,但不能同时具有这两者。