2010-09-14 56 views
19

Tôi đang sử dụng XML và XQuerie. Tôi thường sử dụng một biểu thức XPath liên quan đến một nút cha để lấy nút con của nó. Nhưng, tôi không chắc chắn làm thế nào để làm điều ngược lại nếu tôi có một nút con, làm thế nào để lấy lại nút cha của nó.Làm cách nào để truy xuất nút cha bằng XQuery?

<node id="50> 
    <childnode1 childid="51" /> 
    <childnode2 childid="52" /> 
</node> 

Nếu tôi có các nút <childnode1 childid="51" />, làm thế nào để tôi lấy mẹ: <node id="50>

+0

Câu hỏi hay (+1). Xem câu trả lời của tôi cho một vài giải pháp có thể. –

Trả lời

18

Câu trả lời ngắn:

.. 

này sẽ chọn phụ huynh của nút hiện tại (context).

dài hơn và nhiều hơn nữa những câu trả lời chung:

//node()[childnode1/@childid="51"] 

này sẽ chọn bất kỳ nút trong tài liệu mà có một phần tử con tên là childnode1, có một attibute childid, có giá trị là '51'.

Bạn nên cố tránh biểu thức có chứa chữ viết tắt // vì điều này có thể rất không hiệu quả. Chỉ sử dụng '//' khi cấu trúc của tài liệu XML không được biết trước.

câu trả lời tốt nhất:

ExpressionSelectingTheChildNode/.. 
3

bạn sử dụng .. để có được phụ huynh, như thế này:

../childnode1 

vì vậy nếu bạn có một số XML tài liệu như sau:

<a id="1"> 
    <b id="2"> 
    <c id="3"> 
     <d id="4"/> 
    </c> 
    <c id="5"/> 
    <c id="6"> 
     <d id="7"/> 
    </c> 
    </b> 
</a> 

rồi XQuery

//../d[@id = "4"] 

sẽ trả lại nút c với id của 3.

+0

Biểu thức của bạn có nghĩa là: * từ tất cả các bậc cha mẹ của các nút con trỏ (giống như tất cả các nút có con) một con 'd' với thuộc tính' id' bằng '4' *. Vì vậy, nó không phải là những gì OP được yêu cầu ... –

2

Dưới đây là một ví dụ phức tạp hơn nhận node cha (..).

Q) Tìm tất cả các trường hợp ngôn ngữ phổ biến nhất của một quốc gia là ngôn ngữ phổ biến nhất của một quốc gia khác và cả hai quốc gia đều liệt kê nhiều ngôn ngữ. https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/countries.xml

Một)

for $b in doc("countries.xml")/countries/country/language 
for $c in doc("countries.xml")/countries/country/language 
where $b/../@name != $c/../@name 
and data($b) = data($c) 
and count($b/../language) > 1 
and count($c/../language) > 1 
and $b/@percentage = max($b/../language/@percentage) 
and $c/@percentage = min($c/../language/@percentage) 
return 
    <LangPair language="{data($b)}"> 
    <MostPopular>{data($b/../@name)}</MostPopular> 
    <LeastPopular>{data($c/../@name)}</LeastPopular> 
    </LangPair> 
0

Ngoài ra, bạn cũng có thể tận dụng fn:root() XQuery chức năng.

Các vấn đề liên quan