我不明白为什么元素的顺序是重要的,而不是属性的情况。
任何人都可以提供合理的理由吗?
element addressBook {
element card {
attribute name { text },
attribute email { text }
}*
}
在XML中,属性的顺序传统上并不重要。 RELAX NG遵循这一传统。上述模式将匹配
<card name="John Smith" email="js@example.com"/>
和
<card email="js@example.com" name="John Smith"/>
相反,元素的顺序很重要。模式
element card {
element name { text },
element email { text }
}
不匹配
<card><email>js@example.com</email><name>John Smith</name></card>
那个怎么样:
如果元素或属性的子元素与数据类型模式匹配,则元素或属性的完整内容必须与该数据类型模式匹配。不允许具有允许部分内容与数据类型模式匹配的模式,以及与另一模式匹配的另一部分。例如,不允许使用以下模式:
element bad {
xsd:int,
element note { text }
}
然而,这没关系:
element ok {
xsd:int,
attribute note { text }
}
请注意,此限制不适用于文本模式。
答案 0 :(得分:7)
我怀疑这是因为属性名称在元素中必须是唯一的,并且无论顺序如何都可以消除歧义,而包含的元素不必是唯一的。区分其他相同元素的唯一方法是按顺序排列。当订单很重要时,这很重要。 E.g:
<li>Put on underwear</li>
<li>Put on pants.</li>
在语义上与
不同<li>Put on pants.</li>
<li>Put on underwear</li>
答案 1 :(得分:6)
订购通常很重要。想象一下,例如,XHTML段落是否随机重新排序。然而,属性自然是“属性包” - 一组值而不是序列。这也是为什么你不能用元素声明重复属性,但你可以重复具有相同名称的元素。
这只是XML设计的一部分。属性和元素在很多方面都不同,而不仅仅是排序。有时将处理元素视为与顺序无关是有意义的,但这意味着什么将取决于具体情况。然而,处理一种情况是错误的,在这种情况下,排序无关紧要,因为它应该从不重要。
答案 2 :(得分: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>