用于Xslt键函数的Xquery函数

use*_*342 3 xquery

我想将xslt键函数转换为Xquery函数.任何人都可以帮助我吗?

Dim*_*hev 8

如果我们有xsl:key指示:

<xsl:key name='someName' match="patExpr" use="Expr"/>
Run Code Online (Sandbox Code Playgroud)

并调用该key()函数:

key('someName', someExpr, $someDocNode)
Run Code Online (Sandbox Code Playgroud)

这相当于:

($someDocNode//patExpr)[Expr = someExpr]
Run Code Online (Sandbox Code Playgroud)

因此,对于任何特定的键,您需要声明一个函数(命名它my:keySomeName()),该函数返回一个节点序列,其主体是上面的表达式.

示例:

如果我们有这个xsl:key指示:

  <xsl:key name='kNameByVal' match='Name' use='.'/>
Run Code Online (Sandbox Code Playgroud)

并调用该key()函数:

key('kNameByVal', 'Peter', $doc)
Run Code Online (Sandbox Code Playgroud)

然后相应的XQuery函数将具有此主体:

$doc//Name[. = 'Peter']
Run Code Online (Sandbox Code Playgroud)

如果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(.) ]
}
Run Code Online (Sandbox Code Playgroud)

更传统的非3.0方式是调用者计算表达式并将此计算结果作为my:keyNameByVal()函数的第一个参数传递:

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

}