- - PR -
XSLでテキストノードの取得
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-10-22 12:53
たとえば、下のような XML にした場合はどうでしょうか。
<TOP> <CONTENT>テキスト</CONTENT> <VALUE>テキスト2</VALUE> <VALUE>テキスト2</VALUE> </TOP> | ||||
|
投稿日時: 2001-10-22 13:05
> <CONTENT>テキスト</CONTENT>
このように別の子要素としてタグで括ってやるのが早いのですが、XMLの記述方法を変えないで XSL側でなんとか対処したのです。 やはり無理でしょうか? | ||||
|
投稿日時: 2001-10-22 18:40
こんなのはいかがでしょう。
<xsl:template match="TOP"> <xsl:value-of select="normalize-space(text())" /> </xsl:template> | ||||
|
投稿日時: 2001-10-22 18:49
<xsl:template match="TOP">
<xsl:value-of select="normalize-space(text())" /> </xsl:template> できました! ありがとうございます。 非常に助かりました。m(__)m | ||||
|
投稿日時: 2001-10-31 17:03
再び問題発生です。 <TOP> <VALUE>テキスト2</VALUE> <VALUE>テキスト3</VALUE> テキスト </TOP> こうなっていた場合、normalize-space(text()) とすると、値が空になってしまいます。(T_T) この場合でも確実に取得できる方法はありませんでしょうか? 何度もすみません。m(__)m | ||||
|
投稿日時: 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> もっとキレイに書ける方法があったら教えてください。 | ||||
|
投稿日時: 2001-11-01 09:30
>msxml3.0で試したら、text()が最初のテキストノードの値しか返さないようですね。
>XSLTの仕様としてはこれで正しいのでしょうか? 自分の持っているXSLT本で確認してみました。 text()は「child::text()の省略形で子ノードの中からすべてのテキストノードを選択する」ということです。また、「ノードセットから文字列への変換は最初のノードの文字列値を返す」ということですから、これで正しいのでしょう。 寝ぼけたことを書いてすみませんでした。 |