比較 (XPath)
若要比較 XPath 中的兩個物件,請使用 = 符號來測試是否相等,或使用 != 測試是否不相等。
若是比較運算,必須確定只提供兩個運算元。 接下來評估每個運算元以進行比較,再視需要予以轉換,讓它們擁有相同的型別。 這個動作會根據下述<比較優先順序>中的處理程序執行。
所有項目和屬性都是字串,但對於數字比較,則會自動轉換成整數值。 在比較運算期間,常值數值會轉換成 long 或 double 型別,如下表所示。
如需有關 < 及其他二進位比較運算子的詳細資訊,請參閱底下的<二進位比較運算子>。
常值型別 |
比較 |
範例 |
---|---|---|
String |
text(lvalue) op text(rvalue) |
a < GGG |
Integer |
(long) lvalue op (long) rvalue |
a < 3 |
Real |
(double) lvalue op (double) rvalue |
a < 3.1 |
可在運算式中將單引號或雙引號當作字串分隔符號。 這會使得從指令碼語言中建構和傳遞模式變得更加容易。
如需如何使用 XPath 執行比較的詳細資訊,請參閱 XML 路徑語言 (XPath) 1.0 版<W3C 建議事項 1999 年 11 月 16 日>(英文) 的第 3.4 節<布林值>,其位於 www.w3.org/TR/xpath。
範例
運算式 |
代表意義 |
---|---|
author[last-name = "Bob"] |
至少包含一個 <last-name> 項目 (包含值 Bob) 的所有 <author> 項目。 |
author[last-name[1] = "Bob"] |
其第一個 <last-name> 子項目的所有 <author> 項目的值為 Bob。 |
author/degree[@from != "Harvard"] |
包含 <degree> 項目 (含有不等於 "Harvard" 的 from 屬性) 的所有 <author> 項目。 |
author[last-name = /editor/last-name] |
包含 <last-name> 項目 (該項目與根項目下的 <editor> 項目內部之 <last-name> 項目相同) 的所有 <author> 項目。 |
author[. = "Matthew Bob"] |
其字串值為 Matthew Bob 的所有 <author> 項目。 |
比較優先順序
與資料型別相關的比較會遵循優先順序。
若至少有一個運算元是布林值,則會先將每一個運算元轉換成布林值。
否則,若至少有一個運算元是數字,則會先將每一個運算元轉換成數字。
否則,若至少有一個運算元是日期,則會先將每一個運算元轉換成日期。
否則,會先將兩個運算元轉換成字串。
二進位比較運算子
一組二進位比較運算子會比較數字並傳回布林值結果。 <、<=、> 和 >= 運算子分別用於小於、小於或等於、大於,以及大於或等於。 可在運算式中將單引號或雙引號當作字串分隔符號。 這會使得在指令碼語言中建構和傳遞模式變得更加容易。
請注意,這些比較運算子僅適用於數字。 您可以比較字串是否相等,但是如果您想要比較字串來決定哪一個會在排序順序中先出現,您必須使用 Microsoft XPath 擴充程式函式。
範例
運算式 |
代表意義 |
---|---|
author[last-name = "Bob" and price > 50] |
內含 <last-name> 項目 (含值 Bob) 和 <price> 項目 (其值大於 50) 的所有 <author> 項目。 |
degree[@from != "Harvard"] |
包含不等於 "Harvard" 之 from 屬性的所有 <degree> 項目。 |
book[position() <= 3] |
XML 檔中的前三個 <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>