2010-12-16 4 views
2

У меня есть функция, которая принимает результат как элемент и строку как args, и я хочу использовать эту строку в качестве селектора внутри функции.string as xpath selector

function abc ($results as element()*, $element as xs:string) 
{ 
    for $g in distinct-values($results//*[name() = $element]) (: $results//genre :) 
    let $c := //$results[? = $g]        (: //$results[genre=$g] :) 

} 

Что должно быть вместо '?' в переменной '$ с'

+0

Хороший вопрос, +1. Ваш вопрос не очень хорошо указан, но в своем ответе я попытался угадать и изменить код на то, что может быть полезно. :) – 2010-12-16 03:28:31

+0

Приятная вещь о комментариях XQuery заключается в том, что у вас есть смайлики во всем мире ... – LarsH 2010-12-16 16:48:22

ответ

2
function abc ($results as element()*, $element as xs:string) 
{ 
    for $g in distinct-values($results//*[name() = $element]) (: $results//genre :) 
    let $c := //$results[? = $g]        (: //$results[genre=$g] :) 

} 

, что должно быть на месте "? в переменной «$ с»

Это ошибка синтаксиса писать:

//$results 

Этот вопрос является довольно расплывчатым, но мне кажется, что вы хотите, чтобы сгруппировать элементы , содержащиеся в $results в соответствии с их genre (или любым другим именем элемента, определяемым $element - BTW это имя сосет (элемент не является строкой) - лучше использовать $elementName).

Другой озаботившема является, что вы проверяете полные поддерева увенчанных каждым из элементов в $results - это означает, что они могут иметь несколько genre (или любые другие) потомков.

Чтобы завершить мое угадывание гулянки, мне кажется, что вы хотите:

function grouping-Keys ($elems as element()*, $subElementName as xs:string) as element()* 
{ 
    for $g in distinct-values($elems//*[name() = $subElementName ]) 
    return 
     $elems[//*[name() = $subElementName ] = $g][1]  
} 

Если известно, что $subElementName этого имя ребенка, что любой из элементов в $elems есть , то выше, должны быть лучше записать в виде:

function grouping-Keys ($elems as element()*, $childElementName as xs:string) as element()* 
{ 
    for $g in distinct-values($elems/*[name() = $childElementName ]) 
    return 
     $elems[/*[name() = $subElementName ] = $g][1]  
} 

Оба указанных выше функций возвращает один элемент в расчете на одну (отдельного значения) жанра (или whatev э). Если известно (гарантировано), что каждый элемент в $elems имеет ровно один дочерний (потомственный) с именем жанр (или что-то еще), то результаты этих функций не являются избыточными.