Independientemente del gusto personal, aquí está el conjunto fundamental de cuestiones:
utilizar atributos para asignar valores a los nombres únicos en el pedido no es significativo. De lo contrario, usa elementos.
- Valores: números, cadenas, fechas, etc., pero no objetos de varias propiedades.
- Nombres únicos: cada nombre de atributo en un elemento debe ser único. Si una cosa representada por un elemento puede tener más de un Foo asociado con ella, Foo no debería ser un atributo.
- El pedido no es significativo: la aplicación no puede depender de los valores que se presenten a los procesos en un orden en particular.
Un ejemplo: si desea datos de ida y vuelta entre (digamos) ADO.NET y XML, ¿debe almacenar valores de columna en atributos o elementos? (No importa por un momento que ADO.NET haga esto por usted). Bueno, los nombres de las columnas se asignan a los valores de manera única, y los valores de columna son tipos de datos fácilmente serializables. Muy seguro, ¿por qué no hacer esto?
<Person FirstName="John" MiddleName="Q." LastName="Smith"/>
Pero en realidad esa es una transformación destructora de la información. El orden en que aparecen las columnas en un registro de ADO.NET es significativo. Si hay algo en la columna 2 antes de su transformación, debería estar en la columna 2 después. Convertirlos en atributos perderá esta información. (Sé que una implementación DOM, por ejemplo, que recupera los atributos en orden alfabético por el nombre.)
Esta es la razón por ADO.NET representa filas de este tipo, aunque es prolijo:
<Person>
<FirstName>John</FirstName>
<MiddleName>Q.</MiddleName>
<LastName>Smith</LastName>
</Person>
En cuanto a la la sabiduría común de que los elementos son para información, y los atributos son para metainformación: a menudo es un buen consejo. A menudo, también es superstición lo que los llevará a lugares malos.
Por un lado, la metainformación puede necesitar contener múltiples valores asociados con el mismo nombre. Es posible, por ejemplo, querer etiquetar un elemento con una lista de páginas que se van a usar:
<Person Pages="B1,B2,B3,B4">
<FirstName>John...
vez ha tratado de escribir una plantilla XSLT que analiza una lista separada por comas? Aprenderá mucho al hacerlo, pero probablemente no sea algo que quiera saber.
Por otro lado, los diseñadores de XML que no saben a qué se enfrentan, permiten que estos consejos los lleven a poner un atributo que debería ser realmente en el nombre de la etiqueta del elemento. Por ejemplo:
<Person Type="Employee">
<SSN>123-45-6789</SSN>
<Extension>123</Extension>
</Person>
<Person Type="Customer">
<PhoneNumber>123-456-7890</PhoneNumber>
<BillingAddress>...
y así sucesivamente.¿Adivina qué sucede cuando intenta escribir un esquema que impone reglas diferentes en los elementos Person
basados en el atributo Type
? Fracaso. Los esquemas están vinculados al nombre del elemento. Todos los elementos Person
deben tener el mismo esquema. En este caso, los elementos deben llamarse Employee
y Customer
.
La distinción entre "atributo" y "datos" en este ejemplo no está clara (por decir lo menos). Además, no veo ninguna razón por la que los atributos hagan las cosas "más difíciles" cuando se trabaja con XSLT: ¿está usando el prefijo @ tan difícil? –
Robert: Trato en una aplicación donde se extraen algunos datos de la base de datos y se extraen otros datos de un archivo XML. Con Atributos tal como están, tengo que transformar ese XML en XML en el que puedo meter los datos y luego transformar ese XML en HTML. Es por eso. –