2015-05-24 6 views
5

Xml'den bir veri almak istiyorum Xquery'yi, işleviyle başlatarak kullanma.Xml'den veri alınıyor Xquery ile kullanma işlevi ile başlar

data.xml

   <data><employee id=\"1\"><name value=\"vA-12\">A</name> <title id=\"2\">Manager</title></employee> 
        <employee id=\"2\"><name value=\"vC-12\">C</name><title id=\"2\">Manager</title></employee> 
        <employee id=\"2\"><name value=\"vB-12\">B</name><title id=\"2\">Manager</title></employee> 
      </data> 

Şimdi çalışanın @ id = başlık @ id ve isim @ değeri 'vC' ile başlar sahip olduğunu isim getirmesini istiyoruz.

same.Please aşağıya bakınız için bu XQuery'yi yazdım ama hata-

for $x in /data/employee where $x/@id=$x/title/@id and [fn:starts-with($x/name/@value,vC)] return data($x/name) 

alma bu

Error on line 1 column 55 
    XPST0003 XQuery syntax error near #.../title/@id and [fn:starts-with#: 
    Unexpected token "[" in path expression 
net.sf.saxon.s9api.SaxonApiException: Unexpected token "[" in path expression 
    at net.sf.saxon.s9api.XQueryCompiler.compile(XQueryCompiler.java:544) 
    at Xml.process(Xml.java:46) 
    at Xml.main(Xml.java:30) 
Caused by: net.sf.saxon.trans.XPathException: Unexpected token "[" in path expression 
    at net.sf.saxon.query.XQueryParser.grumble(XQueryParser.java:479) 
    at net.sf.saxon.expr.parser.XPathParser.grumble(XPathParser.java:221) 
+2

Hatanız nedir? – Andrew

+0

@Andrew hata ekledi lütfen yukarıdaki –

+0

, xml iyi biçimlendirilmemiş (öznitelik değerlerinden kaçar) nedir? –

cevap

3

starts-with() fonksiyon iki parametre ister hatasız olduğunu. Özellikle Saxon aşina değilim, ama genel XQuery içinde bu şekilde yapabilirsiniz: senin teşebbüs sorguda olduğu gibi for fıkrada

for $x in /data/employee[@id=title/@id and name[starts-with(@value,'vC')]] 
return data($x/name) 

veya yerine yüklem where maddesini kullanarak:

for $x in /data/employee 
where $x/@id=$x/title/@id and $x/name/starts-with(@value,'vC') 
return data($x/name) 
+1

için çok teşekkürler Cevabınız için çok teşekkür ederim. –

1

tam bağlı

/*/employee[@id eq title/@id and starts-with(name/@value, 'vC')]/data(name) 
0

: Sadece bu daha kısa ve daha basit XPath 2.0 one-liner kullanmak Gereksinimleriniz varsa, bunun yerine ihtiyacınız olabilir (farklılıklardan geçmenize izin veriyorum, ancak temel olarak vC ile başlayan @value ile tüm isimleri seçer, burada diğer çözümler tüm çalışanların isimlerini en az vC ile başlayan tüm isimleri seçer):

/data/employee[@id eq title/@id]/name[starts-with(@value, 'vC')]/data(.)