2009-06-03 68 views
0

我不明白为什么元素的顺序是重要的,但不属性的情况。XML模式的任何好理由“元素的顺序是重要的”规则?

任何一个都可以提供合理的理由吗?

element addressBook { 
    element card { 
    attribute name { text }, 
    attribute email { text } 
    }* 
} 

在XML中,属性的顺序传统上不重要。 RELAX NG遵循这一传统。上述模式将匹配两者

<card name="John Smith" email="[email protected]"/> 

<card email="[email protected]" name="John Smith"/> 

相反,元素的顺序是显著。该模式

element card { 
    element name { text }, 
    element email { text } 
} 

将不匹配

<card><email>[email protected]</email><name>John Smith</name></card> 

什么这一个:

如果一个元素或属性的孩子匹配的数据类型的模式,则该元素的完整内容或属性必须与该数据类型模式匹配。不允许有一种模式允许部分内容匹配数据类型模式,另一部分匹配另一种模式。例如,下面的模式是不允许的:

element bad { 
    xsd:int, 
    element note { text } 
} 

然而,这将是罚款:

element ok { 
    xsd:int, 
    attribute note { text } 
} 

请注意,此限制并不适用于文本模式。

+0

您是否想要对您的“子元素”声明做出某种回复?如果是这样,请在某处填写问题。 – 2009-06-03 22:38:13

回答

6

订购往往是很重要的。想象一下,例如,XHTML段落是否随机重新排序。然而,属性本质上是一个“财产袋” - 一组价值而不是顺序。这也是为什么你不能用元素声明重复属性,但你可以重复具有相同名称的元素。

这只是XML设计的一部分。属性和元素在许多方面有所不同,而不仅仅是排序。有时,元素视为与顺序无关,但这意味着什么取决于确切的情况。然而,将一种情况排序并不重要的情况看作是一种理由,它应该是从来没有的问题。

+0

非常感谢,但我已经更新了我的问题,你能解释一下吗? – omg 2009-06-03 19:16:11

+0

恐怕问题的其余部分是RELAX NG特定的;这通常不是关于XML的。我没有使用RELAX NG的经验。 – 2009-06-03 19:45:12

7

我怀疑这是因为属性名称在元素中必须是唯一的,并且无论顺序如何都可以消除歧义,而包含的元素不必是唯一的。区分其他相同元素的唯一方法是按顺序排列。订单显着时这很重要。例如为:

<li>Put on underwear</li> 
<li>Put on pants.</li> 

是从

<li>Put on pants.</li> 
<li>Put on underwear</li> 
3

语义不同因为具有相同名称的元件可以重复,例如

<List> 
    <Item>a</Item> 
    <Item>b</Item> 
    <Item>c</Item> 
</List> 

虽然属性不能,例如

<List Item="a" Item="b" Item="c" /> <!-- illegal --> 

这意味着元素对于事物列表是有用的,而属性不是。由于列表通常是定位的,因此根据XML中的顺序来推断位置是有意义的,而不像以下那样引起混淆(这将需要对指示位置的方式或额外的XML保留字的专门知识用于此,这两者都不是一个有吸引力的选择)。

<List> 
    <Item Position="2">a</Item> 
    <Item Position="1">b</Item> 
    <Item Position="3">c</Item> 
</List> 
相关问题