@positonに関して

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
okakensanta
アクティブユーザー
記事: 26
登録日時: 2006年8月29日(火) 10:28

@positonに関して

投稿記事 by okakensanta » 2007年4月24日(火) 09:50

初歩的な質問かもしれませんが、
エントリーリストページにて
1 2 3 4
という切替ナビを出すとき、オンページだった場合
リンクを張らないように設定するのに
@positionを使用しますよね。

(例)
<xsl:for-each select="navi">
<xsl:for-each select="page">
<xsl:if test="../@positon=@id">
<strong><xsl:value-of select="@id" /></strong>
</xsl:for-each>
<xsl:if test="not(../@position=@id)">
<a href="{@href}"><xsl:value-of select="@id" /></a>
</xsl:if>
</xsl:for-each>

このときに、なぜ@positionは、一階層上をみないといけないのでしょうか。
<xsl:if test="@position=@id">
では、なぜだめなのでしょうか。

なんか、疑問に思ってしまって・・・・

また、@idというのは、何を意味しているのでしょうか。

なんか、子供っぽい質問ですが、ご返答頂けると幸いです。 :)

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: @positonに関して

投稿記事 by webmaster » 2007年4月24日(火) 17:58

 okakensantaさん、ご質問ありがとうございます。
 非常に良い質問かと思います。この辺は、XMLの本格的な理解が必要になって
くる為、敢えてマニュアルでは説明をしていません。

 XSLTでは、扱うデータ対象を表す方法として「XPath」という表現を使います。
 例えば、

コード: 全て選択

<entry id="00001">
  <data1>データ</data1>
</entry>
 というXMLデータがあった際には、data1を表すXPath表現は「/entry/data1」
となります。
 entryのid属性は、「/entry/@id」と表現されます。属性の場合は@が付くのが
ポイントです。

 この「/」は、URLやフォルダ階層を表すあの「/」とほぼ同じ意味になります。
 ルートから順に、entryの下のdata1、という感じです。

 また、URLやフォルダ階層と同じように、「現在位置」というものを持って
いて、例えば

コード: 全て選択

<xsl:for-each select="entry">
  <xsl:value-of select="data1" />
</xsl:for-each>
 のように、for-eachの中に入った場合には、for-eachでselectした対象の
データが「現在位置」となります。
 なのでこの場合には、「data1」と書けば自動的に「/entry/data1」を表す
ことになります。

 同様に、entryのid属性には、次のようにアクセスできます。

コード: 全て選択

<xsl:for-each select="entry">
  <xsl:value-of select="@id" />
</xsl:for-each>
 for-eachは現在位置を移動するのだ、と覚えておいて下さい。

 ここで、entrylistの場合、デザイン定義には次のようなデータが送られます。
 (かなり簡略化しています。実際にはもっと様々なデータが入っています)

コード: 全て選択

<entrylist>
  <navi position="1">
    <page id="1" />
    <page id="2" />
    <page id="3" />
  </navi>

  <entry id="00001">
    <data1>データ1</data1>
  </entry>

  <entry id="00002">
    <data1>データ2</data1>
  </entry>
</entrylist>
 entrylistの直下にまず、ナビゲーション情報としてnavi要素があり、その中に
全ページ番号情報が入っています。
 「現在のページ番号」であるposition属性を持っているのはnavi要素で、
各ページ番号はその下のpage要素のid属性が保持しています。

 ここで、

コード: 全て選択

<xsl:for-each select="navi">
  <xsl:for-each select="page">
    <xsl:if test="../@positon=@id">
       <strong><xsl:value-of select="@id" /></strong>
  </xsl:for-each>
</xsl:for-each>
 が何を表すかはもうお分かりかと思います。
 navi/@positionにアクセスしたいのですが、その下のpage要素に現在位置が
移ってしまっている為、@positionと書くとpage/@positionを見に行って
しまうのです(もちろんそのようなデータは存在しません)。
 そこで、「../」という「一つ上の階層」を見に行く表現を使って、naviの
要素へアクセスしています。

 かなりはしょって説明させて頂きましたが、ご不明な点はまたご質問頂ければ
幸いです。

 また、実際のところこの辺はかなり分かり難い用語やデータ名になってしまって
いると思います。その点、お詫び申し上げます。m(__)m

okakensanta
アクティブユーザー
記事: 26
登録日時: 2006年8月29日(火) 10:28

ありがとうございます。

投稿記事 by okakensanta » 2007年5月14日(月) 16:52

早々のご返答、
ありがとうございます :P

返信