2014-03-29 36 views
0

我有这样的XML文档:(其中这可以被嵌套多次)的Xquery - 发现如何找到任意深度的节点

<?xml version = "1.0" encoding = "UTF -8"?> 
<person xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance" 
    name = "Adrian" 
    gender = "male"> 
    <children> 
     <person name = "Sabina" gender = "female"> 
      <children> 
      <person name = "Dolores" gender = "female"/> 
      <person name = "Ahmed" gender = "male"/> 
      <person name = "Nusrat" gender = "female"/> 
      </children> 
     </person> 
     <person name = "Alfonso" gender = "male"> 
      <children> 
      <person gender = "female" name = "Perdita"/> 
      <person gender = "male" name = "Ioan "> </person> 
      </children> 
     </person> 
    </children> 
</person> 

我给原始XML的缩写形式。 XML可以是任意的深度。我必须找到关系。 (1)兄弟关系(2)阿姨侄子关系。 (巴黎实际上可以)

我的兄弟姐妹巴黎:

<sibling>Sabrina,ALfonso</sibling> <sibling>Dolores,Ahmed</sibling> 
<sibling>Dolores,Nusrat</sibling> <sibling>Ahmed,Nusrat</sibling> 
<sibling>Perdita,Ioan</sibling> 

它不应该是困难的。但是如果是Aunt-Nephew对,我们还必须检查性别。 阿姨 - 侄子双输出

<AuntNeph>Sabrina,Ioan</AuntNeph> 

谢谢。

+0

什么是您预期的输出? – helderdarocha

+0

我的确认识到'孩子'元素最好叫'父母',不是吗?否则,我不明白该查询的意思。 –

+0

输出想: “臭”, “阿方” “多洛雷斯” “艾哈迈德” “珀迪塔”, “伊万” Nusrat

回答

1

对于每个person,请检查其他人(兄弟姐妹)的following-sibling轴。只检查一种方式(不能同时包括以下)以省略重复的同胞对(例如“Sabina Alfonso”和“Alfonso Sabina”)。

for $person in //person 
for $sibling in $person/following-sibling::person 
return element sibling { string-join(($person, $sibling)/@name, ',') } 

对于侄子查询颇为相似,我不认为这需要进一步的解释:

for $aunt in //person[@gender="female"] 
for $nephew in $aunt/(preceding-sibling::person, following-sibling::person)/children/person[@gender="male"] 
return element AuntNeph { string-join(($aunt, $nephew)/@name, ',') } 
+0

在//儿童$对 回报 “{$双/人[1]/data(@name)}“ ”{$ pair/person [2]/data(@name)}“ 是正确的答案。 – Nusrat

+0

如果有两个以下的孩子,它也不能得到兄弟姐妹对。 – Nusrat

+0

我无法修复它像人[1],人[2] – Nusrat