IBM の Web サイトに「XML 設計の原則: 要素と属性を使用する場合」というタイトルの記事があります。
厳格なルールはあまりないように見えますが、投稿にはいくつかの優れたガイドラインが記載されています。たとえば、推奨事項の 1 つは、XML プロセッサが属性内のデータを正規化して生のテキストを変更する可能性があるため、データの空白を正規化してはならない場合に要素を使用することです。
さまざまな XML 構造を開発していると、ときどきこの記事を参照していることに気づきます。これが他の人にも役立つことを願っています。
編集 - サイトから:
コアコンテンツの原則
問題の情報が、XML で表現または伝達されている重要な資料の一部であると考える場合は、それを要素に入れます。人間が読める文書の場合、これは通常、読者に伝えられるコアコンテンツを意味します。マシン指向のレコード形式の場合、これは通常、問題のドメインから直接来るデータを意味します。情報が主な通信の周辺または付随的なものであると考える場合、またはアプリケーションが主な通信を処理するのを助けることを純粋に意図している場合は、属性を使用します。これにより、コアコンテンツが補助資料でごちゃごちゃになるのを回避できます。マシン指向のレコード形式の場合、これは通常、問題領域からのメイン データに関するアプリケーション固有の表記を意味します。
例として、私は多くの XML 形式を見てきましたが、通常は企業内で開発されたもので、文書のタイトルが属性に配置されています。タイトルはドキュメントのコミュニケーションの基本的な部分であるため、常に要素のコンテンツに含める必要があると思います。一方で、製品の記述的な記録に、製品の内部識別子が要素として投入されているケースをよく見かけます。これらのケースのいくつかでは、特に ID が非常に長い形式または不可解な形式である場合に、特定の内部製品コードが文書のほとんどの読者または処理者にとって主要な関心事ではないため、属性の方が適切でした。
原則としてデータは要素に、メタデータは属性に含まれると聞いたことがあるかもしれません。上記の 2 つの段落は、実際には同じ原則を表していますが、より意図的であいまいでない言葉で表現されています。
構造化情報の原則
情報が構造化された形式で表現されている場合、特に構造が拡張可能な場合は、要素を使用します。一方、情報がアトミック トークンとして表現されている場合は、属性を使用します。要素は、XML で構造を表現するための拡張可能なエンジンです。ほとんどすべての XML 処理ツールはこの事実に基づいて設計されており、構造化された情報を適切に要素に分割すると、処理ツールが設計を補完し、それによって生産性と保守性が向上することがわかります。属性は、要素で表される情報の単純なプロパティを表現するために設計されています。構造化された情報を属性に押し込んで XML の基本アーキテクチャに反する作業を行うと、見掛け倒しの簡潔さと利便性が得られる可能性がありますが、メンテナンス コストが発生する可能性があります。
日付は良い例です。日付は構造が固定されており、通常は単一のトークンとして機能するため、属性として意味があります (できれば ISO-8601 で表現されます)。一方、個人の名前を表すことは、この原則がデザイナーを驚かせるのを見てきました。属性に名前が含まれているのをよく見かけますが、個人名は要素の内容に含めるべきだと常に主張してきました。個人名は驚くほど多様な構造を持っています (一部の文化では、敬称を省略したり、名前の一部の順序を想定したりすることで、混乱や不快感を引き起こす可能性があります)。また、個人名がアトミック トークンであることはめったにありません。例として、姓や姓で検索またはソートしたい場合があります。フルネームを 1 つの要素のコンテンツに押し込むことは、それを属性に入れることと同じくらい問題があることを指摘しておく必要があります。