Niezależnie od gustu, tutaj jest podstawowym zbiorem zagadnień:
Wykorzystanie atrybutów do mapowania wartości unikatowych nazw podczas zamawiania nie jest znacząca. W przeciwnym razie użyj elementów.
- Wartości: liczby, łańcuchy, daty itd., Ale nie obiekty o wielu właściwościach.
- Unikalne nazwy: każda nazwa atrybutu na elemencie musi być niepowtarzalna. Jeśli rzecz reprezentowana przez element może mieć więcej niż jedno skojarzenie z Foo, Foo nie powinien być atrybutem.
- Zamawianie nie jest znaczące: aplikacja nie może zależeć od wartości przedstawianych procesom w określonej kolejności.
Przykład: jeśli chcesz zaokrąglić dane między (powiedzmy) ADO.NET i XML, czy wartości kolumn powinny być przechowywane w atrybutach lub elementach? (Nie przejmuj się przez chwilę, że ADO.NET robi to za Ciebie.) Cóż, nazwy kolumn są odwzorowywane w unikalny sposób, a wartości kolumn są łatwo serializowanymi typami danych. Na pewno, dlaczego tego nie zrobić?
<Person FirstName="John" MiddleName="Q." LastName="Smith"/>
Ale tak naprawdę jest to niszcząca informacje transformacja. Kolejność kolumn wyświetlana w rekordzie ADO.NET jest znacząca. Jeśli coś jest w kolumnie 2 przed transformacją, powinno być w kolumnie 2 później. Konwertowanie ich na atrybuty spowoduje utratę tych informacji. (Znam jeden implementacja DOM, na przykład, że pobiera atrybuty w porządku alfabetycznym według nazwy.)
Dlatego ADO.NET reprezentuje wiersze jak ten, choć jest rozwlekły:
<Person>
<FirstName>John</FirstName>
<MiddleName>Q.</MiddleName>
<LastName>Smith</LastName>
</Person>
Jeśli chodzi o powszechna mądrość, że elementy są dla informacji, a atrybuty są dla metainformacji: jest to często bardzo dobra rada. Często jest to także przesąd, który doprowadzi cię do złych miejsc.
Po pierwsze, metainformacja może wymagać wielu wartości powiązanych z tą samą nazwą. Można, na przykład, chcesz oznaczyć element z listy stron, które będą go używać:
<Person Pages="B1,B2,B3,B4">
<FirstName>John...
kiedykolwiek próbował napisać szablon XSLT, który analizuje listę oddzielonych przecinkami? Dowiesz się wiele, robiąc to, ale prawdopodobnie nie jest to coś, o czym chcesz wiedzieć.
Po drugie, projektanci XML, którzy nie wiedzą, z kim mają do czynienia, niech te wskazówki poprowadzą ich do wpisania atrybutu, który powinien znajdować się w nazwie znacznika elementu. Na przykład:
<Person Type="Employee">
<SSN>123-45-6789</SSN>
<Extension>123</Extension>
</Person>
<Person Type="Customer">
<PhoneNumber>123-456-7890</PhoneNumber>
<BillingAddress>...
i tak dalej.Zgadnij, co się dzieje, gdy próbujesz napisać schemat wymuszający różne reguły na elementach Person
na podstawie atrybutu Type
? Niepowodzenie. Schematy są powiązane z nazwą elementu. Wszystkie elementy Person
muszą mieć ten sam schemat. W takim przypadku elementy powinny mieć nazwy: Employee
i Customer
.
Rozróżnienie między "atrybutem" a "danymi" w tym przykładzie jest niejasne (co najmniej). Ponadto, nie widzę powodu, dla którego atrybuty sprawiają, że rzeczy "trudniejsze" podczas pracy z XSLT: używasz prefiksu @, że trudne? –
Robert: Zajmuję się aplikacją, w której niektóre dane są pobierane z bazy danych, a inne dane są pobierane z pliku XML. Z atrybutami takimi, jakimi są, muszę przekształcić ten XML na XML, do którego mogę wprowadzić dane, a następnie przekształcić ten XML w HTML. Dlatego. –