2015-05-24 1 views
5

Ich möchte Daten aus XML abrufen Xquery mit Starts mit Funktion verwenden.Abrufen von Daten aus XML Verwenden von Xquery mit Starts mit Funktion

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> 

Jetzt möchte ich diesen Namen holen, die id = title @ id und name @ Wert Mitarbeiter @ beginnt mit 'vC' hat.

Ich habe diese xquery geschrieben für die same.Please unten sehen, aber fehler-

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

immer das ist fehler-

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

Was ist Ihr Fehler? – Andrew

+0

@Andrew hinzugefügt Fehler pls siehe oben –

+0

ist Ihre XML nicht gut formatiert (Escape in Attributwerte)? –

Antwort

3

starts-with() Funktion zwei Parameter erwartet. Ich bin nicht mit Saxon speziell vertraut, aber im Allgemeinen xquery können Sie auf diese Weise tun:

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

oder where Klausel statt Prädikat in for-Klausel, wie in Ihrem versuchen Abfrage:

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

vielen Dank für die Antwort. –

1

nutzen Sie einfach die kürzer und einfacher XPath 2.0 Einzeiler:

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

Je nach Ihren genauen Anforderungen, möglicherweise müssen Sie dies stattdessen (ich lasse Sie durch die Unterschiede gehen, aber im Grunde wählt es alle Namen mit beginnend mit vC, wobei die anderen Lösungen hier alle Namen aller Mitarbeiter mit mindestens einem Namen beginnend mit vC auswählen):

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