タグ: XML XPath 関数

Node-set関数一覧

Xpath関数は大きく分けてノードセット・ブール・数値・文字列関数の4つに分類されます。その中でも今回はノードセット関数の使用方法を見ていきます。

ノードセットの関数は、ノードの集合または集合の中の特定のノードを返す関数群です。

ノードセット関数一覧

関数名

書式

戻り値

備考

関数名

Last

書式

last()

戻り値

数字

備考

最終ノードの位置を示す数値を取得します。ノードの数を取得する場合にも使用されます。

関数名

Position

書式

position()

戻り値

数字

備考

ノードの位置を示す数値を取得します。

関数名

Count

書式

count(nodeset)

戻り値

数字

備考

引数のノードセットの数を取得します。

関数名

local-name

書式

local-name(nodeset?)

戻り値

文字列

備考

引数のノードセットの最初のローカル名を取得します。引数がない場合にはコンテキストノードが引数となります。

関数名

namespace-uri

書式

namespace-uri(nodeset?)

戻り値

文字列

備考

引数のノードセットの最初の名前空間URIを取得します。引数がない場合にはコンテキストノードが引数となります。

関数名

name

書式

name(nodeset?)

戻り値

文字列

備考

引数のノードセットの最初のノード名を取得します。引数がない場合にはコンテキストノードが引数となります。


Count関数

引数のNode-Setの数を返す関数です。

書式は"Count(xPath)"です。

引数のXPath内で集計対象となるノードを取得するための式を指定します。

引数内にさらに条件式やほかの関数を使用することも可能です。

count関数

					<!--XML-->
					<?xml version="1.0"?>
					<?xml-stylesheet type="text/xsl" href="test.xsl"?>
					<root>
					  <item id="1">
					    <name>aacaa</name>
					    <number>20</number>
					    <item id="1-1">
					      <name>aaaaaaa</name>
					      <number>30</number>
					    </item>
					  </item>
					  <item id="2">
					    <name>bbc</name>
					    <number>10</number>
					  </item>
					</root>
					
					<!--XSL-->
					<?xml version="1.0" encoding="utf-8"?>
					<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
					<xsl:output method="html" encoding="UTF-8"/>
					<xsl:template match="/">
					  <xsl:value-of select="count(//*)"/><!--10が返ってくる-->
					  <xsl:value-of select="count(//item)"/><!--3が返ってくる-->
					  <xsl:value-of select="count(./root/item)"/><!--2が返ってくる-->
					  <xsl:value-of select="count(//number[.>20])"/><!--1が返ってくる-->
					  <xsl:value-of select="count(//name[contains(., 'c')])"/><!--2が返ってくる-->
					</xsl:template>
					</xsl:stylesheet>

last関数

引数はありません。戻り値は最終ノードの位置を示す数値です。

カレントノードの最終のノードを取得してきます。

よく"position"関数とともにXSL内での条件分岐に使用されている印象があります。

last関数

					<!--XML-->
					<?xml version="1.0"?>
					<?xml-stylesheet type="text/xsl" href="test.xsl"?>
					<root>
					  <item id="1">
					    <name>aacaa</name>
					    <number>20</number>
					    <item id="3">
					      <name>aaaaaaa</name>
					      <number>30</number>
					      <shortname>USA</shortname>
					    </item>
					  </item>
					  <item id="2">
					    <name>bbc</name>
					    <number>10</number>
					    <label>USA</label>
					  </item>
					</root>
					
					<!--XSL-->
					<?xml version="1.0" encoding="utf-8"?>
					<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
					  <xsl:template match="/">
					    <xsl:apply-templates select="//item" />
					  </xsl:template>
					  <xsl:template match="item">
							<xsl:text<ID=</xsl:text<
						  <xsl:value-of select="@id"/>
							<xsl:text<, NodeName=</xsl:text<
						  <xsl:value-of select="name(./*[last()])"/>
					  </xsl:template>
					</xsl:stylesheet>

上記のコードを実行すると、"ID=1,NodeName=item"、ID=3,NodeName=shortname"、ID=2,NodeName=label"の順に変換されます。


Local-Name関数

ノード セット引数の中でドキュメント順の最初にあるノードの展開名のローカル部分を返します。

ローカル部分とは、空間指名を持つエレメントの場合"名前空間:ノード名"となります。

XPathを用いてノードの走査をする場合に、同じ名前のノードであっても名前空間が違えば別物とみなされます。そこで名前空間を無視してノードを操作するのによく使われるのが"local-name"関数です。

local-name関数

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<root>
  <a:item xmlns:a="x-schema:testa.xml">
    <a:name>schema-a</a:name>
  </a:item>
  <b:item xmlns:b="x-schema:testb.xml">
    <b:name>schema-b</b:name>
  </b:item>
  <item>
    <name>schema-none</name>
  </item>
</root>

<!--XSL-->
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:apply-templates select="//*"/> <!--①-->
  </xsl:template>

  <xsl:template match="*[local-name()='name']"><!--②-->
    <xsl:text>local-name: </xsl:text>
    <xsl:text>name=</xsl:text>
    <xsl:value-of select="name()"/>
    <xsl:text> local-name=</xsl:text>
    <xsl:value-of select="local-name()"/>
    <xsl:text> text=</xsl:text>
    <xsl:value-of select="text()"/>
  </xsl:template>

  <xsl:template match="*">;<!--③-->
	  <xsl:text>other: </xsl:text>
		<xsl:text>name=</xsl:text>
		<xsl:value-of select="name()"/>
		<xsl:text> local-name=</xsl:text>
    <xsl:value-of select="local-name()"/>
    <xsl:text> text=</xsl:text>
    <xsl:value-of select="text()"/>
  </xsl:template>
</xsl:stylesheet>
				

上記のコードで注意したいのが、①の送る側で"//*[local-name()='name']"とし、②の受ける側は"name"のみにすると名前空間のあるものは受け取ってくれなくなり、③のテンプレートに流れてしまいます。


name/Local-Name/namespace-uri関数

ローカルネーム関数に似ている関数で、"name"と"namespace-uri"があります。 基本的に使い方はほとんど同じですので、それぞれの違いを覚えておけばOKでしょう。

local-name関数

          <?xml version="1.0"?>
          <?xml-stylesheet type="text/xsl" href="test.xsl"?>
          <root>
          <a:item xmlns:a="x-schema:testa.xml">
          <a:name>schema-a</a:name>
          </a:item>
          <b:item xmlns:b="x-schema:testb.xml">
          <b:name>schema-b</b:name>
          </b:item>
          <item>
          <name>schema-none</name>
          </item>
          </root>

          <!--XSL-->
          <?xml version="1.0" encoding="utf-8"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:output method="html" encoding="UTF-8"/>
          <xsl:template match="/">
          <html>
          <body>
          <xsl:apply-templates select="//*[local-name()='name']"/>
          </body>
          </html>
          </xsl:template>

          <xsl:template match="*">
          <xsl:text>other: </xsl:text>

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

          <xsl:text>name=</xsl:text>
          <xsl:value-of select="name()"/>

          <xsl:text>local-name=</xsl:text>
          <xsl:value-of select="local-name()"/>

          <xsl:text>namespace-uri=</xsl:text>
          <xsl:value-of select="namespace-uri()"/>
          </xsl:template>

          </xsl:stylesheet>
        

出力結果

            other:
            text=schema-a
            name=a:name
            local-name=name
            namespace-uri=x-schema:testa.xml

            other:
            text=schema-b
            name=b:name
            local-name=name
            namespace-uri=x-schema:testb.xml

            other:
            text=schema-none
            name=name
            local-name=name
            namespace-uri=