2011-09-23 26 views
4

的縮寫誰能解釋什麼是的XPath - position()函數

/root/a[position()=1 or position()=2 

/root/a[1 or 2] 

之間的區別? 我假設第二個是第一個的縮寫形式,但是Java XPath(Sun JDK 1.6.0)處理器認爲不然。以下是我的測試應用程序。

libxml2庫和db2 XPath處理器也認爲這些路徑不同。所以它看起來不像JDK的bug。

import java.io.*; 
import javax.xml.xpath.*; 
import org.w3c.dom.*; 

import org.xml.sax.InputSource; 

public class XPathTest { 
    public static void main(String[] args) throws Exception { 
     //String xpathStr = "/root/a[position()=1 or position()=2]"; 
     String xpathStr = "/root/a[1 or 2]"; 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xp = xpf.newXPath(); 
     Reader irdr = new StringReader(
       "<root><a name=\"first\"/><a name=\"second\"/><a name=\"third\"/></root>"); 
     InputSource isrc = new InputSource(irdr); 
     XPathExpression expr = xp.compile(xpathStr); 
     Object result = expr.evaluate(isrc, XPathConstants.NODESET); 
     NodeList nodes = (NodeList) result; 
     for (int i = 0; i < nodes.getLength(); i++) { 
      Node node = nodes.item(i); 
      Element element = (Element) node; 
      System.out.print(element.getNodeName() + " " + element.getAttributeNode("name")); 
      System.out.println(); 
     } 
    } 
} 
+0

我猜@安頓不會回來,但如果他確實應該將[生鏽的答案](http://stackoverflow.com/a/7525994/539490)標記爲正確 – AJP

回答

0

[1 or 2]計算爲在.net中的 「總是爲真」 謂詞一樣,所以這種行爲似乎是一致的:

下面是一個.NET 3.5的XmlDocument

// Returns first, second 
    var ndl = dom.SelectNodes(@"/root/a[position()=1 or position()=2]"); 

    // Returns first, second and third 
    ndl = dom.SelectNodes(@"/root/a[1 or 2]"); 

    // Returns first, second 
    ndl = dom.SelectNodes(@"/root/a[1] | /root/a[2]"); 
一中的XPath輸出

編輯

在XPath 2,你可以使用sequence functionsindex-ofexists確定給定的位置是否被包含在一個值序列:

/root/a[exists(index-of((1,2), position()))] 
+0

這與我的發現一致,但不會不解釋爲什麼1或2有時被視爲布爾值,有時被視爲數字。 – Anton

4

我不認爲[1 or 2]正在評估您怎麼看它正在評估。 or適用於兩個布爾值。我懷疑12評估爲真實。因此,這個表達式被評估爲真實的,基本上什麼也不做,並且會返回所有的元素。

一般而言,position()可用於像[position() <= 5]這樣的表達式中,而索引地址只能選擇一個元素,如[5]

+0

如果'1'或'2'用作'或'運算符的參數時總是計算爲真,爲什麼在被'[]'使用時有時計算爲假(例如/ root /路徑不存在文件)? – Anton

+1

@Anton:在這種情況下,它仍然計算爲「true()」,但是它必須過濾掉的節點集是空的節點集。 –

0

[]中的數值被視爲索引。 OR不適用於像您的方式索引([1 or 2])。正確的方法是使用position()

+0

我不確定。我的理解是,總是被認爲是布爾表達式的內容(所謂的謂詞)。如果在那裏找到整數(例如'i'),它會擴展爲布爾表達式,如 – Anton

+0

...擴展爲布爾表達式,如[position()= i] – Anton

+0

我還沒有太熟練的使用註釋marku。再試一次:-) 我不確定。我的理解是,總是被認爲是布爾表達式的內容(所謂的謂詞)。如果在那裏找到整數(例如'i'),它將擴展爲布爾表達式,如'[position()= i]'然後進行評估。 – Anton

1

如果方括號中的值是數字[N],則它被解釋爲[position()=N]。但[1 or 2]不是一個數字,所以此規則不適用。