我想将xslt键函数转换为Xquery函数。 任何人都可以帮助我吗?
答案 0 :(得分:8)
如果我们有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()
函数的第二个操作数是一个更复杂的表达式,那么计算该表达式的函数必须作为第二个参数传递给你的键实现函数(所以这只能在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]
}
}