2015-05-24 24 views
5

Tôi muốn tìm nạp dữ liệu từ xml Sử dụng Xquery với bắt đầu bằng hàm.Tìm nạp dữ liệu từ xml Sử dụng Xquery với bắt đầu với hàm

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> 

Bây giờ tôi muốn lấy cái tên trong đó có nhân viên @ id = title @ id và tên @ giá trị bắt đầu với 'VC'.

Tôi đã viết xquery này cho same.Please xem dưới đây nhưng nhận sai sót

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

đây là sai sót

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

Lỗi của bạn là gì? – Andrew

+0

@Andrew thêm lỗi xin xem ở trên –

+0

là xml của bạn không được định dạng tốt (thoát trong giá trị thuộc tính)? –

Trả lời

3

starts-with() chức năng hy vọng hai tham số. Tôi không quen thuộc với Saxon cụ thể, nhưng trong xquery chung bạn có thể làm theo cách này:

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

hoặc sử dụng where khoản thay vì vị trong for khoản, như trong truy vấn cố gắng của bạn:

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

cảm ơn bạn rất nhiều vì câu trả lời. –

1

Chỉ cần sử dụng ngắn hơn và đơn giản hơn XPath này 2.0 one-liner:

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

Tùy thuộc vào chính xác của bạn yêu cầu, bạn có thể cần điều này thay vì (tôi cho phép bạn thực hiện các khác biệt, nhưng về cơ bản nó chọn tất cả các tên với @value bắt đầu bằng vC, trong đó các giải pháp khác ở đây chọn tất cả tên của tất cả nhân viên có ít nhất một tên bắt đầu bằng vC):

/data/employee[@id eq title/@id]/name[starts-with(@value, 'vC')]/data(.) 
Các vấn đề liên quan