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