比較 (XPath)
XPath で 2 つのオブジェクトを比較する場合、値が等しいことをテストするには =、等しくないことをテストするには != を使用します。
比較演算には、2 つのオペランドを指定する必要があります。 次に、各オペランドが評価され、必要な場合は両者が同一の型になるように変換して、比較が行われます。 これは下記の「比較演算の優先順序」で示す手順で行われます。
すべての要素と属性は文字列ですが、数値の比較では整数値として自動的にキャストされます。 リテラル数値は比較演算の際に、次の表に示すように、long 型または倍精度浮動小数点型にキャストされます。
< および他の二項比較演算の情報については、後の「二項比較演算子」を参照してください。
リテラルの種類 |
比較 |
例 |
---|---|---|
String |
text(lvalue) op text(rvalue) |
a < GGG |
整数 |
(long) lvalue op (long) rvalue |
a < 3 |
Real |
(double) lvalue op (double) rvalue |
a < 3.1 |
式における文字列の区切り文字として、引用符または二重引用符を使用できます。 これにより、スクリプト言語内でパターンを作成して渡すことが容易となります。
XPath を使用して比較を行う方法の詳細については、www.w3.org/TR/xpath のセクション 3.4「XML Path 言語 (XPath) バージョン 1.0 ("Booleans") (W3C 勧告 1999 年 11 月 16 日)」を参照してください。
例
式 |
説明 |
---|---|
author[last-name = "Bob"] |
値 Bob を持つ少なくとも 1 つの <last-name> 要素を含むすべての <author> 要素。 |
author[last-name[1] = "Bob"] |
最初の子要素 <last-name> の値が Bob になっているすべての <author> 要素。 |
author/degree[@from != "Harvard"] |
from 属性が"Harvard" に等しくない <degree> 要素を含むすべての <author> 要素。 |
author[last-name = /editor/last-name] |
ルート要素の下の <editor> 要素内の <last-name> 要素と同一の <last-name> 要素を含むすべての <author> 要素。 |
author[. = "Matthew Bob"] |
文字列値が Matthew Bob であるすべての <author> 要素。 |
比較演算の優先順序
比較演算ではデータ型に関して次の順序に従います。
少なくとも 1 つのオペランドがブール値の場合、最初に各オペランドはブール値に変換されます。
少なくとも 1 つのオペランドが数値の場合、最初に各オペランドは数値に変換されます。
少なくとも 1 つのオペランドが日付の場合、最初に各オペランドは日付に変換されます。
以上に該当しない場合、両方のオペランドは最初に文字列値に変換されます。
二項比較演算子
一連の二項比較演算子により、数値が比較され、ブール型の結果が返されます。 <、<=、>、および >= 演算子はそれぞれ、小、小または等しい、大、大または等しいに使用されます。 式における文字列の区切り文字として、引用符または二重引用符を使用できます。 これによりスクリプト言語内でパターンを作成して渡すことが容易となります。
これらの比較演算子は数値に対してのみ動作することに注意してください。 文字列が等しいかどうかを比較することはできますが、文字列を比較して並べ替え順序の前後を判別するには、Microsoft XPath 拡張関数を使用する必要があります。
例
式 |
説明 |
---|---|
author[last-name = "Bob" and price > 50] |
<last-name> 要素の値が Bob であり、<price> 要素の値が 50 より大であるすべての <author> 要素。 |
degree[@from != "Harvard"] |
from 属性が "Harvard" と等しくないすべての <degree> 要素。 |
book[position() <= 3] |
XML ファイル内の最初の 3 つの <book> 要素 (1, 2, 3)。 |
例
XML ファイル (test.xml)
<?xml version="1.0"?>
<test>
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
<x a="2">
<y>y2</y>
</x>
<x a="3">
<y>y3</y>
</x>
</test>
XSLT ファイル (test.xsl)
次の XSLT スタイル シートは、ドキュメント内で最初の兄弟である <x> 要素を選択します。
<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<!-- Suppress text nodes not covered in subsequent template rule. -->
<xsl:template match="text()"/>
<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="*|@*"/>
<xsl:if test="text()">
<xsl:value-of select="."/>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
<xsl:template match="/test">
<xsl:apply-templates select="//x[position() = 1 ] "/>
</xsl:template>
</xsl:stylesheet>
書式付き出力
上の XML ファイルに変換を適用すると以下の結果が得られます。
<x a="1">
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
</x>
<x a="2" b="B">
<x>
<y>y31</y>
<y>y32</y>
</x>
</x>
<x>
<y>y31</y>
<y>y32</y>
</x>