違う親を持つ同じ名前の要素は判別できるのか?
異なる親要素の子として同名の子要素を使った場合、コンピュータにはその違いが判別できなくなるのでしょうか?

回答/富士ソフトABC株式会社 技術センター
2001/10/17

 質問はもう少し詳細なものでしたので、まずはそれを見てください。

 異なる親要素の子として同名の子要素を使った場合、コンピュータにはその違いが判別できなくなるのでしょうか?

XML文書

<役員>
  <氏名>山田太郎</氏名>
</役員>
<大株主>
  <氏名>加藤次郎</氏名>
</大株主>
DTD

<!ELEMENT 役員(氏名)>
<!ELEMENT 氏名(#PCDATA)>
<!ELEMENT 大株主(氏名)>
<!ELEMENT 氏名(#PCDATA)>

 上記のXML文書では<氏名>要素が2カ所に出てきます。この場合、コンピュータには役員の山田太郎と、大株主の加藤次郎は判別できなくなってしまうのでしょうか? 判別できなくなってしまうのであれば、親要素名の<役員><大株主>には意味があるのでしょうか?

 判別できない場合は、ネームスペースを使うことで回避するのがよいのでしょうか。それとも、<役員氏名><大株主氏名>といった、ユニークな名前を使い分けなければならないのでしょうか。

 特定の要素(この場合“氏名”)にのみ注目した場合、同じ名前の要素の判別はできなくなりますが、その親要素から注目すれば、意味の違いは判別できます。具体的に親要素から特定の要素を指定するには、XPathを使って指定します。この場合、“役員/氏名”、もしくは“大株主/氏名”と指定することで、プログラム中でそれぞれの要素を特定することができます。

 複数の場所で同一の要素名や属性名を使用することは、定義を簡素化する上では良い方法です。同じ意味の要素を別の名前で複数定義することは、かえって無駄を多く含むと同時に名前付けに苦労することにもなります。

 注意すべき点として、XSLTのTemplateを使った処理を記述した場合、上の例では単に“氏名”を指定すると、区別することなく全てに対して同様に処理してしまいます。そのため、前述のようにXPathの表現を用いて“役員/氏名”のように親要素から指定する必要があります。サンプルを下記に示します。

<?xml version="1.0" encoding="SHIFT-JIS"?>
<?xml-stylesheet type="text/xsl" href="sample1.xsl"?>
<!DOCTYPE doc [
<!ELEMENT info (役員,大株主)>
<!ELEMENT 役員 (氏名)>
<!ELEMENT 大株主 (氏名)>
<!ELEMENT 氏名 (#PCDATA)>
]
>
<info>
  <役員>
    <氏名>山田太郎</氏名>
  </役員>
  <大株主>
    <氏名>加藤次郎</氏名>
  </大株主>
</info>
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   
<xsl:template match="/">
    <table align="center" border="2" >
      <tr>
        <td>役員</td>
        <td><xsl:value-of select="info/役員/氏名"/></td>
      </tr>
      <tr>
        <td>大株主</td>
        <td><xsl:value-of select="info/大株主/氏名"/></td>
      </tr>
    </table>
  </xsl:template>
</xsl:stylesheet>
同名だが親が異なる要素を持つXML文書に対して、XPathで親を含めてスタイルシート中で指定する。下の画面は、その結果。

 同名の要素を複数の場所で使用することについての是非について考えてみましょう。XML文書全体の要素や属性が少ない場合は、それぞれに別の名前を付けて定義した方が良く、階層が深く同じ親要素を持つ子要素が多くなる場合は、同名の要素を使用する方が良いでしょう。

 ネームスペース(名前空間:Namespaces in XML)は、自分が作成したXML文書と他のXML文書で使用されている要素名や属性名が同じ場合に、区別するために使用する規約です。確かに1文書内で同一の名前を区別するために利用できますが、そのためにネームスペースの定義が増えていくので実用的ではなく、かえって混乱する可能性が高いでしょう。それよりも、前述したXPathによる指定のほうがすっきりします。

 最後に、この質問で書かれているDTDの記述には間違いが含まれています。複数の要素の子要素として同じ要素名を定義する場合は以下のように記述します。要素名として同じ名前を複数定義できません。

DTD

<!ELEMENT 役員(氏名)>
<!ELEMENT 大株主(氏名)>
<!ELEMENT 氏名(#PCDATA)>

 

「Ask XML Expert」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間