过去几天我一直在研究我的XML模式技能,并且在一整天中我忙着尝试理解关于模式的命名空间的复杂性。让我印象最深刻的是form="qualified|unqualified"
属性在非全局<element>
和<attribute>
元素上看似毫无用处。
我的问题是:form
属性是否实际上增加了XML模式/ XML文档的表达性,还是只是使某些XML文档的符号更容易/不同?
我理解,当要使用命名空间限定所有元素时,需要符合某个模式的XML文档通常更容易编写(文档元素上只需要一个xmlns =“xyz”属性),但是这就是全部?为什么有人会打扰不合格的非全球元素呢?
答案 0 :(得分:4)
首先,关于正式问题:form
属性是否实际上增加了XSD的表现力?我想是这样的:使用form
属性,我可以编写类型,其有效实例集不能(据我所见)与任何不使用form
属性的类型匹配。
例如(在定义类型为a
的名为duration
的顶级元素的模式中):
<choice maxOccurs="unbounded">
<element form="qualified" name="a" type="integer"/>
<element form="unqualified" name="a" type="gYear"/>
</choice>
然后,在不太正式的问题上:为什么有人会打扰?
简短的回答是:因为对于本地元素和属性的合格和非限定名称的每种可能的选择方式,有些人认为这是声明本地元素和/或属性的正确方法。
更长的答案需要一点时间。坐下来,给自己一杯咖啡。
当地元素有两种思想流派;两者都在设计XSD的工作组中有代表。
有一种观点认为,如果元素P在命名空间N中,并且元素C对于元素N:P的类型是局部的,那么子元素应该命名为N:C是很自然的。毕竟,它是与P相同的词汇表的一部分,并且识别词汇表是命名空间的全部内容。从你的最后一个问题来看,我猜你倾向于这种看待事物的方式。
另一派思想认为,本地元素就像本地属性一样。元素N:P的本地属性(P)被命名为A,而不是N:A - 名称N:根据定义,A表示属于名称空间N的全局属性,而不是元素N:P的本地属性。通过类比,当地儿童也应该使用不合格的名字,以便以类似的方式处理属性和子元素。
XSD元素和属性声明中form
属性的存在可能暗示可能存在第三种思想流派,其特点是希望将合格和不合格名称之间的选择视为设计选择为每个本地元素或属性单独提取,而不一定在单个词汇范围的法令中。对于它的价值,这第三个思想学派似乎并不存在。至少,我认为我从未遇到过会员。似乎没有人开始用合格和不合格的本地名称的混合来编写上面展示的那种复杂类型。 form
属性的基本功能不是允许不同的本地元素限定或不限定,而是通过封闭模式元素上的elementFormDefault
和attributeFormDefault
属性设置其默认值,从而确保即使模式作者在某种程度上坚持使用这些属性的错误值,他们仍然可以获得他们想要的效果。
我也从未(我知道)遇到过前两个思想流派中的任何一个成员,他们对另一所学校的推理感到任何同情。任何人都可以想到其他思想学派的成员认为的方式几乎总是令人不快的惊喜。只需付出一点努力,精明的聪明人就会发现接受其他思想流派的存在是可能的,甚至(稍加努力)接受那个思想学派的成员真诚地争论,不只是试图搞砸了作品。各种各样的观点都充满了人类学的兴趣(看看人们可以声称相信的非常奇怪的东西,即使他们看起来大多数或多或少是理性的生物!有趣的旧世界,不是吗?)。经过几个月的僵局,大多数工作组成员被迫承认他们只是无法说服其他人看到他们的错误。
然后很明显,工作组中的每个人都对我们能想到的三种可能性有相同的排名:
每个人都喜欢第一种选择(对于“I”的合适值),但对于不同的WG成员,“我认为正确的方式”结果表示不同的东西。
没有人非常喜欢第二种选择,因为它会使架构作者的生活更加艰难,并导致架构范围内的一致性降低。
但是每个人都讨厌第三种选择(被迫按照其他人想要的方式做事),以至于他们愿意接受妥协而不是冒险彻底失败。