2012-12-09 31 views

回答

6

如果我们有一个xsl:key指令

<xsl:key name='someName' match="patExpr" use="Expr"/> 

并向key()功能一个电话:

key('someName', someExpr, $someDocNode) 

这相当于

($someDocNode//patExpr)[Expr = someExpr] 

因此,对于任何特定的键,你需要声明一个函数(命名为my:keySomeName())返回节点序列,其身体上的表达。

如果我们有这样的xsl:key指令

<xsl:key name='kNameByVal' match='Name' use='.'/> 

这调用key()功能

key('kNameByVal', 'Peter', $doc) 

那么相应的XQuery函数将有本机构

$doc//Name[. = 'Peter'] 

万一key()函数的第二操作数是一个更复杂的表达式,计算该表达式必须作为第二个参数将密钥传递函数-implementing函数(因此,这是唯一可能的XQuery中3.0及以上)和我们最终是这样的:

declare function my:keyNameByVal($funExpr as function($context as node()) as item()*, 
           $currenDoc as document-node() 
           ) as node()* 
{ 
    $currenDoc//Name[. = $funExpr(.) ] 
} 

的更传统的非3.0方式是呼叫者计算表达式,并传递这个结果计算作为第一个参数my:keyNameByVal()功能:

declare function my:keyNameByVal($useExpr as item()*, 
           $currenDoc as document-node() 
           ) as node()* 
{ 
    $currenDoc//Name[. = $useExpr] 
} 

}

+1

感谢它做的魔力 – user1890342