,这里是问题的根本设定:
使用属性进行排序时不显著到值映射到唯一的名称。否则,使用元素。
- 值:数字,字符串,日期等,但不是多属性对象。
- 唯一名称:元素上的每个属性名称必须是唯一的。如果一个元素表示的事物可以有多个Foo关联,Foo不应该是一个属性。
- 排序不重要:应用程序不能依赖以特定顺序呈现给进程的值。
一个例子:如果你想在ADO.NET和XML之间往返(比如说),你应该在属性还是元素中存储列值? (不要紧,ADO.NET会为你做这件事。)那么,列名唯一地映射到值,并且列值是随时可序列化的数据类型。那么确定,为什么不这样做呢?
<Person FirstName="John" MiddleName="Q." LastName="Smith"/>
但实际上这是一个破坏信息的转换。列出现在ADO.NET记录中的顺序非常重要。如果在转换之前第2列出现某些内容,则应该在第2列之后。将它们转换为属性将会丢失这些信息。 (我知道一个DOM实现,例如,通过名称检索按字母顺序排列的属性。)
这就是为什么ADO.NET代表这样行,虽然详细的是:
<Person>
<FirstName>John</FirstName>
<MiddleName>Q.</MiddleName>
<LastName>Smith</LastName>
</Person>
对于元素用于信息的共同智慧,以及元信息的属性:这通常是很好的建议。这往往只是迷信,会导致你进入不好的地方。
首先,元信息可能需要包含多个与同名相关联的值。你可能会,比方说,要与将使用它的网页列表标记元素:
<Person Pages="B1,B2,B3,B4">
<FirstName>John...
试过编写解析逗号分隔的列表中的XSLT模板?通过这样做你会学到很多东西,但这可能不是你想知道的。另一方面,XML设计者不知道他们反对什么,让这个建议让他们把一个属性放在元素的标签名称中。例如:
<Person Type="Employee">
<SSN>123-45-6789</SSN>
<Extension>123</Extension>
</Person>
<Person Type="Customer">
<PhoneNumber>123-456-7890</PhoneNumber>
<BillingAddress>...
等等。猜猜当你试图编写一个基于Type
属性的Person
元素上强制执行不同规则的模式时会发生什么?失败。模式绑定到元素名称。所有Person
元素必须具有相同的模式。在这种情况下,元素应该被命名为Employee
和Customer
。
在这个例子中“属性”和“数据”之间的区别是不清楚的(至少可以这么说)。另外,我没有看到为什么这些属性使得XSLT工作变得“更加困难”:使用@前缀很困难? – 2009-02-07 07:46:12
Robert:我处理的是从数据库中提取一些数据的应用程序,其他数据是从XML文件中提取的。使用属性的方式,我必须将该XML转换为XML,以便将数据填入数据,然后将该XML转换为HTML。这就是为什么。 – 2009-02-07 12:52:13