2015-05-24 9 views
5

Voglio recuperare un dato da xml Usando Xquery con inizia con la funzione.Recupero dei dati da xml Utilizzando Xquery con inizia con la funzione

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> 

Ora voglio andare a prendere quel nome che ha impiegato @ id = @ title id e valore di nome @ inizia con 'vC'.

Ho scritto questo XQuery per il same.Please vedi sotto, ma sempre senza errori

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

questo è senza errori funzione

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

Qual'è il tuo errore? – Andrew

+0

@Andrew aggiunto errore pls vedere sopra –

+0

il tuo xml non è ben formattato (fugge nei valori degli attributi)? –

risposta

3

starts-with() si aspetta due parametri. Non ho dimestichezza con sassone nello specifico, ma in generale, XQuery si può fare in questo modo:

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

o utilizzando where clausola invece di predicato nella for clausola, come nel vostro tentativo di query:

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

grazie mille per la risposta. –

1

basta usare questo breve e più semplice XPath 2.0 one-liner:

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

a seconda del vostro esatto requisiti, potresti invece averne bisogno (ti faccio passare le differenze, ma fondamentalmente seleziona tutti i nomi con @value a partire da vC, dove le altre soluzioni qui selezionano tutti i nomi di tutti i dipendenti con almeno un nome che inizia con vC):

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