中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

XMLってなぁに?(第14回)

前回の結果をおさらいしてみよう

問い:全店舗の商品一覧を取得するxslを考えてみよう。
現在の結果:
東京店HDDレコーダCDプレイヤー大阪店HDDレコーダCDプレイヤーPC

不必要な店名が入ってしまっているのが問題だ。
これはなぜ入っているのだろうか。

ここで思い返してほしい、最初にXSLが登場したときにvalue-ofは紹介せずに<apply-templates>だけを行えば、要素のテキスト情報(テキストノード)が出力されるといった趣旨の説明をした。(第4回の最後)

テキストノードは存在するのに、何の手当てもされない要素に対して適用されるテンプレートがデフォルトで適用される。

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

それがこういうテンプレートだ。ここでいうtext()はテキストノードを意味する。
またvalue-ofの"."は現在の適用対象のテキストノード自身である。

自動でこのようなテンプレートが適用されるのだとすると、このテンプレートを使わないようにすればいい。

<xsl:template match="text()" />

このような1行を追加すれば、無事未処理の要素のテキストノードは無視される。

a.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="/ROOT/店舗/在庫">
 <xsl:for-each select="商品">
  <xsl:value-of select="text()" />
 </xsl:for-each>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
結果.txt
HDDレコーダCDプレイヤーHDDレコーダCDプレイヤーPC

参照:
text() XPath1.0 2.3章 ノードテスト
デフォルトのテンプレート XSLT1.0 5.8章 組み込みテンプレートルール

投稿日時 : 2004年10月7日 12:50

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント