XMLってなぁに? 初級編 第14回
2005/08/14
この文書は執筆時点(2004/後半)での知識を基にしており、現状とあっていない可能性があります。
第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章 組み込みテンプレートルール