2016-04-01 20 views
1

bir sorgu sonucu nasıl sorgulanır Ben bir temel şey Saxon HE 9.7 xquery ile yapmaya çalışıyorum. Bir dizi öğe döndüren bir sorgu var. Sonra her bir elemanı ayrı ayrı sorgulamak istiyorum. Ama sadece bu eleman üzerinde nasıl bir sorgu yapılacağını anlayamıyorum. setContextItem() numaranın işe yarayacağını düşündüm ama işe yaramadı.Sakson xquery

Sorunumu gösteren basit bir örnek oluşturdum. <element> üzerinden döngü yapıyorum ve daha sonra her öğe için <name>'u almak istiyorum. Ama benim sorgum hiçbir şey vermiyor, çünkü sadece xml değil, sadece elementi sorgulıyor. İç sorguyu //name olarak değiştirirseniz, belgedeki tüm ad etiketlerini döndürür.

Dosya verileri/example.xml:

<root> 
    <element> 
     <name>1</name> 
    </element> 
    <element> 
     <name>2</name> 
    </element> 
</root> 

Java kodu:

public static void main(String[] args) throws SaxonApiException 
{ 
    Processor proc = new Processor(false); 
    XPathCompiler xpath = proc.newXPathCompiler(); 
    DocumentBuilder builder = proc.newDocumentBuilder(); 
    XdmNode rootNode = builder.build(new File("data/example.xml")); 
    String xquery = "/root/element"; 
    XPathSelector selector = xpath.compile(xquery).load(); 
    selector.setContextItem(rootNode); 
    for (XdmItem item : selector) 
    { 
     xquery = "/element/name"; 
     XPathSelector selector2 = xpath.compile(xquery).load(); 
     selector2.setContextItem(item); 
     System.out.println("item=" + item); 
     if (selector2.iterator().hasNext()) 
      System.out.println("name=" + selector2.iterator().next()); 
     else 
      System.out.println("Not found"); 
    } 
} 

Benim Maven bağımlılık:

<dependency> 
    <groupId>net.sf.saxon</groupId> 
    <artifactId>Saxon-HE</artifactId> 
    <version>9.7.0-4</version> 
</dependency> 

Sonuç:

item=<element> 
     <name>1</name> 
    </element> 
Not found 
item=<element> 
     <name>2</name> 
    </element> 
Not found 

cevap

3

XPath'da, / başlangıçta her zaman belge düğümüne başvurur.

xquery = "./name"; 

Ya da sadece / tamamen * kaldırmak:

xquery = "name"; 
bağlam elemanı saygı için XPath (döngü içine bir) istiyorsanız, tam durağı ( .) ile başlar yapmaya

*) Durumunuz için çalışacaktır çünkü child::, hiçbiri açıkça belirtilmediyse kullanılacak varsayılan eksendir.