- PR -

XSLでテキストノードの取得

投稿者投稿内容
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2001-10-22 12:18
<TOP>
 テキスト
 <VALUE>テキスト2</VALUE>
 <VALUE>テキスト3</VALUE>
</TOP>

というXMLから、

<xsl:template match="TOP">
 <xsl:value-of select="text()" />
</xsl:template>

で「テキスト」という文字列を取得すると、前後の改行コードも同時に取得されてしまいます。
これを防ぐ方法はありませんでしょうか?
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2001-10-22 12:53
たとえば、下のような XML にした場合はどうでしょうか。

<TOP>
<CONTENT>テキスト</CONTENT>
<VALUE>テキスト2</VALUE>
<VALUE>テキスト2</VALUE>
</TOP>
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2001-10-22 13:05
> <CONTENT>テキスト</CONTENT>

このように別の子要素としてタグで括ってやるのが早いのですが、XMLの記述方法を変えないで
XSL側でなんとか対処したのです。

やはり無理でしょうか?
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-10-22 18:40
こんなのはいかがでしょう。

<xsl:template match="TOP">
 <xsl:value-of select="normalize-space(text())" />
</xsl:template>
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2001-10-22 18:49
<xsl:template match="TOP">
 <xsl:value-of select="normalize-space(text())" />
</xsl:template>

できました!
ありがとうございます。
非常に助かりました。m(__)m
なかむら
ベテラン
会議室デビュー日: 2001/10/22
投稿数: 67
投稿日時: 2001-10-31 17:03
引用:

できました!
ありがとうございます。
非常に助かりました。m(__)m



再び問題発生です。
<TOP>
 <VALUE>テキスト2</VALUE>
 <VALUE>テキスト3</VALUE>
 テキスト
</TOP>
こうなっていた場合、normalize-space(text()) とすると、値が空になってしまいます。(T_T)
この場合でも確実に取得できる方法はありませんでしょうか?

何度もすみません。m(__)m
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-10-31 18:35
msxml3.0で試したら、text()が最初のテキストノードの値しか返さないようですね。
XSLTの仕様としてはこれで正しいのでしょうか?

とりあえず、動くようにしたのが次のコードです。

<xsl:template match="TOP">
<xsl:for-each select="text()">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>

もっとキレイに書ける方法があったら教えてください。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2001-11-01 09:30
>msxml3.0で試したら、text()が最初のテキストノードの値しか返さないようですね。
>XSLTの仕様としてはこれで正しいのでしょうか?

自分の持っているXSLT本で確認してみました。

text()は「child::text()の省略形で子ノードの中からすべてのテキストノードを選択する」ということです。また、「ノードセットから文字列への変換は最初のノードの文字列値を返す」ということですから、これで正しいのでしょう。

寝ぼけたことを書いてすみませんでした。




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