- PR -

select=

1
投稿者投稿内容
ibara
常連さん
会議室デビュー日: 2002/11/15
投稿数: 26
投稿日時: 2002-11-15 16:14
現在MSXML3.0でXMLの勉強をしています。
apply-templatesの動作を確認しようと、以下のような記述をしました。
[XML]:
<ルート要素>
<子要素>最初の子要素のテキスト</子要素>
<子要素>次の子要素のテキスト
<孫要素>最初の孫要素のテキスト</孫要素>
<孫要素>2番目の孫要素のテキスト</孫要素>
</子要素>
</ルート要素>

[XSL]:
<xsl:template match="/">
<xsl:apply-templates select="ルート要素/子要素"/>
</xsl:template>

<xsl:template match="子要素">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>

上記を用いて変換した結果、以下のようになりました。
-----------------------------------------------------------
最初の子要素のテキスト次の子要素のテキスト

最初の孫要素のテキスト 2番目の孫要素のテキスト
-----------------------------------------------------------
しかし、私が期待していたのは、こういう結果です。
-----------------------------------------------------------
最初の子要素のテキスト次の子要素のテキスト
-----------------------------------------------------------

そこでxslの
<xsl:value-of select="."/>

<xsl:value-of select="./text()"/>
にしてやると、期待通りの結果が得られました。
select="."はselect="./text()"と同じ意味だと思っていたのですが、
これはどう理解したらよいのでしょうか?
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2002-11-16 14:58
>select="."はselect="./text()"と同じ意味だと思っていたのですが、

select="."は、カレントにある全てのタイプのノードを含みますってことです。
つまり、<孫要素>タグで囲まれるノードも、カレントノード(子要素)内の一部
を構成する要素であるから、中身を繋げた形になったわけです。

select="./text()"は、カレントノードの文字データを表すノードが対象になる
形になります。この場合、<孫要素>はカレントノードを構成する別のノードって
いうことになるので、テキストノードとは違う次元になります。だから孫要素の
内容が抽出されなかったというわけです。私もテキストノード、アトリビュート
ノード、コメントノードなどなど、XPathで用意されているさまざまな仕組みが
上手く使えてない口なので、頑張りまーす。

※今度掲示板にXMLを書くときは、インデント付けてくれると見やすいっすよ。

ibara
常連さん
会議室デビュー日: 2002/11/15
投稿数: 26
投稿日時: 2002-11-22 17:05
ありがとうございます。
ちょっと調べなおしました。
.はself::node()の意味なんですね。

では
http://www.atmarkit.co.jp/fxml/tanpatsu/10xslt/xslt02.html

>XSLTプロセッサが現在処理しているノードをカレントノードといい、
>XPathでは“.”と表現します。
>カレントノードの子テキストノードを取り出す場合、次のように表現できます。
というのは間違いでしょうか?
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2002-11-23 13:52

>ちょっと調べなおしました。
>.はself::node()の意味なんですね。

というように、調べられた結果から言えば表現は合っていないですよね。
自分が読んでいない記事の内容が合っている/いないというのを書くのは
気が進まないんですがね・・・。本来この質問は、ライターさんにするの
がいいと思いますよ。
(^^
1

スキルアップ/キャリアアップ(JOB@IT)