概念
XPathはW3Cの標準仕様で、XMLドキュメント内のノードを移動・検索するために作られており、XSLTのコア基盤です。XSLTのselect=""やtest=""の内部式にはすべてXPathが使われます。
- パス式によりノードを特定
- 文字列、数値、日付比較、ノード操作、論理演算など100種類以上の標準組み込み関数を搭載
7種類のノード型
ドキュメントノード(ルートノード)、要素ノード、属性ノード、テキストノード、コメントノード、処理命令ノード、名前空間ノード。
例:
<title lang="eng">Harry Potter</title>
<title>→ 要素ノードlang="eng"→ 属性ノードHarry Potter→ テキストノード
概念
- 基本値(原子値 Atomic value):子ノードも親ノードも持たないノードの内容。例:
eng、29.99 - アイテム(Item):アイテム=ノード または基本値
XMLノード同士の関係
<bookstore><book><title></title></book></bookstore>を例に説明
- 親(Parent):要素と属性はそれぞれ親を一つだけ持ちます。
bookはtitleの親ノード - 子(Children):要素は複数の子ノードを持てます。
title、priceはbookの子ノード - 兄弟(Sibling):同じ親ノードを持つノード。同じ階層のtitleとpriceは互いに兄弟ノード
- 祖先(Ancestor):親、親の親、上位すべてのノード。
titleの祖先はbook、bookstore
パス式
パスと手順によってXMLノードを選択します
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
</bookstore>Code language: HTML, XML (xml)
| 式 | 意味 |
|---|---|
bookstore | ルート配下のbookstore要素を選択 |
/bookstore | 絶対パス、ルートノードから照合開始 |
bookstore/book | bookstore配下のすべてbook子要素を選択 |
//book | ドキュメント内あらゆる場所のbook要素(グローバル検索) |
//@lang | 名前がlangの属性ノードをすべて選択 |
XPath関数:position()
<xsl:value-of select="position()" />Code language: HTML, XML (xml)
position()はXPath標準関数で、ノードセット内における現在のノードの連番を取得し、カウントは1から始まります。
サンプル:連番出力
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head></head>
<body>
<ul>
<!--生徒一覧 class/student をループ -->
<xsl:for-each select="class/student">
<xsl:sort select="age"/> <!--年齢昇順でソート-->
<!--身長>160の生徒を抽出-->
<xsl:if test="height > 160">
<li>
<xsl:value-of select="position()" />、<!--連番出力-->
<xsl:value-of select="name"/>;
<!--複数条件分岐-->
<xsl:choose>
<xsl:when test="height > 200">
<b><xsl:value-of select="age"/></b>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="age"/>
</xsl:otherwise>
</xsl:choose>
</li>
</xsl:if>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>Code language: HTML, XML (xml)
XPath