2012-12-09 83 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