2012-03-05 81 views
3

我正在为一个相当复杂的XML文件格式编写XSD。在许多方面,XML可以包含实际的文字值或产生该值的脚本。 (想想Excel中:42=21+21XSD:可以具有简单内容或元素上下文的复杂类型

例如,指定大小,它应该是有效的写以下任一操作:

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

我首先想到的是用<choice>成实现一个int或size元素中的脚本。然而,那么我将不得不给这个字符串元素一个名字,导致一个笨拙的语法,如<size><value>42</value></size>。由于文字将比脚本使用得多,我不想夸大他们的语法。

任何想法如何在XSD中表示初始语法?

回答

4

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

  1. 在这两种情况下,请勿在<size>之内放置任何子元素。相反,您可以在size元素上设置'type'属性,向消费者指示它是文字还是脚本。对复杂内容
  2. 使用这里所描述的两种技术(二者均基于使用“混合= true”特性:XML Schema: Element that can contain elements or text?

这些选项之间做出选择,你会把自己在消费者应用程序的鞋,并决定最有可能获得这些数据的方式。一般来说,如果主要消费者是开发人员将XML解析为一次性集成任务(因为输出和XSD更多简洁,在我看来更可读);选项二可能更好,如果你看到一个XML工具消耗你的模式,因此如果有具体的元素解析出来,它可能更容易做一些特殊的事情。最终,尽管我只是猜测你的用例是什么......

+0

我接受此答案,因为它显示最佳选项。但是,如果不使用混合内容来牺牲控制权,就不可能获得我想要的确切语法。我终于选择了size元素的两个版本,每个版本都有不同的名称。 – 2012-04-21 10:14:22

2

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

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

相关问题