string作为xpath选择器

时间:2010-12-16 02:54:45

标签: xpath xquery

我有一个函数,它将结果集作为元素,将字符串作为args,我希望将此字符串用作函数内的选择器。

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] :)

 }

什么应该取代'?'在变量'$ c'

1 个答案:

答案 0 :(得分: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] :) 

 } 
  

什么应该取代'?'在   变量'$ c'

编写语法错误

//$results

这个问题相当含糊,但在我看来,您希望根据$results(或任何定义的元素名称)对genre中包含的元素进行分组by $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]     
 } 

上述两个函数每个(不同的)类型(或其他)返回一个元素。如果已知(保证)$elems中的每个元素都只有一个子(后代)命名为genre(或其他),则这些函数的结果不是多余的。