2009-06-03 43 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>