2013-10-10 5 views
0

Используя это в качестве примера:XPath - Только первый элемент для каждого из элементов второго уровня

<root> 
    <gramps name="Bill"> 
    <him name="Bill Jr"> 
     <kid name="Bill III"/> 
    </him> 
    </gramps> 
    <gramps name="Tom"> 
    <him name="Al"> 
     <kid name="Al Jr"/> 
    </him> 
    </gramps> 
    <gramps name="Bob"> 
    <him name="Bob Jr"> 
     <kid name="Sam"/> 
    </him> 
    </gramps> 
    <store name="Tom's"/> 
    <store name="Bill's"/> 
    <store name="Pete's"/> 
</root> 

я могу получить все элементы второго уровня с:

/*/* 

я могу получить имена для всех элементов второго уровня, gramps store, с:

distinct-values(/*/*/name()) 

Как я могу получить только первый элемент для каждого из элементов второго уровня в результате:

<gramps name="Bill"> 
    <him name="Bill Jr"> 
     <kid name="Bill III"/> 
    </him> 
    <store name="Tom's"/> 

ответ

4

Вы можете проверить на каждое имя, если есть предыдущий с тем же именем:

/*/*[not(preceding-sibling::*/name() = name())] 

Или, вероятно, быстрее, найти первый для каждого имя:

for $name in distinct-values(/*/*/name()) return /*/*[name() = $name][1] 
+0

Для более подробного примера время соответствует вашему утверждению. XPath: 1500 сек. XQuery: 1,5 сек. –

Смежные вопросы