Re: Content v. attribute

Joe Lapp (david@megginson.com)
Mon, 26 Oct 1998 11:47:32 -0500 (EST)


Dave Winer writes:

> I consider it a flaw of XML that it has two ways to do hierarchy,
> one much more powerful than the other. In working with other
> companies about formats you can get into endless meaningless
> debates about whether it's better to use attributes or just stick
> with <tag> structures. When I design XML forms for our own internal
> applications, I have generally found that if I use attributes, I
> end up regretting it and switch over to straight tag hierarchy. You
> always have the option of adding a structure where a scalar used to
> be when you go that way. With attributes, you're at the end of the
> road, no way to have structure, so I agree with John Cowan
> entirely, you never know what's coming down the road, so it's
> better to leave some room on either side. Dave

There was a long-running debate in the old SGML world about whether
attributes should be allowed at all. Personally, I like them --
although Len's point about my data being someone else's metadata is
well-received, I still want to have the choice to use

<section id="foo">
...
</section>

or

<note security="confidential">Remember to close the panel.</note>

or

<link href="http://www.megginson.com">Megginson Technologies</link>

rather than

<section>
<id>foo</id>
...
</section>

or

<note>
<security>confidential</security>
<text>Remember to close the panel.</text>
</note>

or

<link>
<href>http://www.megginson.com</href>
<label>Megginson Technologies</label>
</link>

There are, of course, many cases where the latter examples are
preferable.

I agree with all of the posters that in general using elements rather
than attributes is a good design principle, but I do think that there
are useful data/meta-data distinctions to be made, even if they are
extremely fuzzy.

One of the reasons data people jump to attributes is the fact that

<account number="345"
type="asset"
name="Accounts Receivable"
currency="usd"
status="current"
balance="34,569.35"/>

looks an awful lot like

public interface Account
{
public abstract int getNumber ();
public abstract int getType ();
public abstract String getName ();
public abstract String getCurrency ();
public abstract boolean isCurrent ();
public abstract float getBalance ();
}

or

create table Account (
num int primary key,
type int,
name char(80),
currency int,
status bool,
balance float
);

It's not easy to start thinking differently.

All the best,

David

-- 
David Megginson                 david@megginson.com
           http://www.megginson.com/