サンプルで覚えるXSLTプログラミング

12. ノードに関する関数

 ノードに関する関数を使うと、処理中のタグの名称や現在位置を知ることができます。


current()

現在のノードを返します。返り値はノード表現です。


last()

現在のノードの最年少弟ノードの番号を返します。返り値は数値です。


local-name(node)

引数 引数タイプ
node ノード表現

node引数で与えられた表現のlocal値(namespaceを外したもの)を、文字列として返します。


name()

現在のノードの名前を、文字列として返します。


namespace-uri(node)

引数 引数タイプ
node ノード表現

node引数で、namespaceが定義されているURIを、文字列として返します。


 ここまでに紹介したいくつかの関数を使った例を見てみましょう。

(XML文書:TestNode1.xml)

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="TestNode1.xsl"?>
<address>
  <city>東京</city>
  <section>千代田区</section>
  <street>紀尾井町4-1</street>
  <zip>102-0094</zip>
</address>

(XSLTプログラム:TestNode1.xsl)

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="Shift_JIS"/>


<xsl:template match="/address">
  <page>
    <xsl:apply-templates/>
  </page>
</xsl:template>


<xsl:template match="*">
  <xsl:value-of select="name()"/>:
  <xsl:value-of select="current()"/>
</xsl:template>


</xsl:stylesheet>

(出力結果)

<?xml version="1.0" encoding="Shift_JIS" ?>
<page>city: 東京 section: 千代田区 street: 紀尾井町4-1 zip: 102-0094</page>

 まず、XSLTプロセッサは<xsl:template match="/address">で“address”ノードを処理し
ます。 その後<page>タグを出力し、続く<xsl:apply-templates/>で、“address”ノードの子ノードを<xsl:template match="*">によって“city”、“section”、“street”、“zip”の順に処
理していきます。

 “city”ノードは <xsl:value-of select="name()"/>でノードの文字列である“city”を出力し、次に“:”を出力します。最後に<xsl:value-of select="current()"/>でノードの中身である“東京”を出力していきます。 同じように“section”、“street”、“zip”を処理して行き、プロセッサーは<xsl:template match="/address">に戻り、</page>タグを出力します。


position()

現在のノードの位置(兄弟の中で)を、数値で返します。

 今度は、前述のlast()とposition()を使った例を紹介しましょう。

(XML文書:djia.xml)

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="djia.xsl"?>
<djia>
  <company>ALCOA</company><company>ExxonMobil</company>
  <company>McDonalds</company><company>American Express</company><company>General Electric</company>
  <company>Merck</company><company>AT&amp;T</company>
  <company>General Motors</company><company>Microsoft</company>
  <company>Boeing</company><company>Hewlett-Packard</company><company>Minn Mining &amp; Manuf.</company><company>Caterpillar</company>
  <company>Home Depot</company><company>Morgan, J.P.</company><company>Citigroup</company>
  <company>Honeywell</company><company>Phillip Morris</company><company>Coca-Cola</company>
  <company>Intel</company><company>Proctor &amp; Gamble</company><company>Disney</company>
  <company>IBM</company><company>SBC Communications</company><company>DuPont</company>
  <company>International Paper</company><company>United Technologies</company><company>Eastman Kodak</company>
  <company>Johnson &amp; Johnson</company><company>Wal-Mart</company>
</djia>

(XSLTプログラム)

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


<xsl:output method="xml" encoding="Shift_JIS"/>

<xsl:template match="/djia">
  <page>
    <xsl:apply-templates/>
  </page>
</xsl:template>


<xsl:template match="company">
  <xsl:value-of select="current()"/>
  <xsl:value-of select="position()"/>:
  <xsl:if test="current()=../company[last()]">
最後です
  </xsl:if>
</xsl:template>

</xsl:stylesheet>


(出力結果)

<?xml version="1.0" encoding="Shift_JIS" ?>
<page>ALCOA1: ExxonMobil2:McDonalds3: American Express4: General Electric5: Merck6: AT&T7: General Motors8: Microsoft9: Boeing10: Hewlett-Packard11: Minn Mining & Manuf.12: Caterpillar13: Home Depot14:
Morgan, J.P.15: Citigroup16: Honeywell17: Phillip Morris18: Coca-Cola19: Intel20: Proctor & Gamble21: Disney22: IBM23: SBC Communications24: DuPont25: International Paper26: United Technologies27: Eastman Kodak28: Johnson & Johnson29: Wal-Mart30: 最後です</page>


Index
サンプルで覚えるXSLTプログラミング
  1. XMLからHTMLへの変換
スタイルシートはどのように解釈されるか
  2. XPathの基礎知識
XML文書をツリー構造で見る
XPathの表記方法
  3. XSLTエレメントの概要
コラム XSLTプロセッサのインストール
  4. テンプレート系XSLTエレメント
テンプレートの定義
該当するテンプレートの適用
指定されたテンプレートの呼び出し
  5. 変数系XSLTエレメント
変数の定義1
変数の定義2
  6. 出力系XSLTエレメント
該当する表現の値を代入
エレメントノードの生成
属性ノードの生成
テキストノードの生成
コメントノードの生成
PI(processing-instruction)の生成
出力方法の指定
  7. フローコントロール系XSLTエレメント
ループ処理
条件分岐
IF文
  8. その他のXSLTエレメント
他のXSLファイルの読み込み
数の割り当て
  9.XSLT関数の概要
関数の主な分類
  10. 文字列系関数
文字列の連結
文字列の調査
数字のフォーマッティング
空白の除去
……
  11. 数値計算系関数
切り上げ
表現の数を数える
切り下げ
数値型への変換
四捨五入
加算
12. ノードに関する関数
  13. bool代数系関数
  14. その他の関数
  15. JavaによるXSLTの拡張
Built-inクラスの呼び出し
カスタムメイドの関数を作る

 



XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間