Xslt键函数的Xquery函数

Xslt键函数的Xquery函数,xquery,Xquery,我想将xslt键函数转换为Xquery函数。 有人能帮我吗 如果我们有xsl:key指令: <xsl:key name='someName' match="patExpr" use="Expr"/> key('someName', someExpr, $someDocNode) ($someDocNode//patExpr)[Expr = someExpr] <xsl:key name='kNameByVal' match='Name' use='.'/>

我想将xslt键函数转换为Xquery函数。 有人能帮我吗


如果我们有
xsl:key
指令

<xsl:key name='someName' match="patExpr" use="Expr"/>
key('someName', someExpr, $someDocNode)
($someDocNode//patExpr)[Expr = someExpr]
  <xsl:key name='kNameByVal' match='Name' use='.'/>
key('kNameByVal', 'Peter', $doc)
$doc//Name[. = 'Peter']
这相当于

<xsl:key name='someName' match="patExpr" use="Expr"/>
key('someName', someExpr, $someDocNode)
($someDocNode//patExpr)[Expr = someExpr]
  <xsl:key name='kNameByVal' match='Name' use='.'/>
key('kNameByVal', 'Peter', $doc)
$doc//Name[. = 'Peter']
因此,对于任何特定的键,都需要声明一个函数(将其命名为my:keySomeName()),该函数返回一个节点序列,其主体是上述表达式

示例

<xsl:key name='someName' match="patExpr" use="Expr"/>
key('someName', someExpr, $someDocNode)
($someDocNode//patExpr)[Expr = someExpr]
  <xsl:key name='kNameByVal' match='Name' use='.'/>
key('kNameByVal', 'Peter', $doc)
$doc//Name[. = 'Peter']
如果我们有这个
xsl:key
指令

<xsl:key name='someName' match="patExpr" use="Expr"/>
key('someName', someExpr, $someDocNode)
($someDocNode//patExpr)[Expr = someExpr]
  <xsl:key name='kNameByVal' match='Name' use='.'/>
key('kNameByVal', 'Peter', $doc)
$doc//Name[. = 'Peter']
那么相应的XQuery函数将具有以下主体

<xsl:key name='someName' match="patExpr" use="Expr"/>
key('someName', someExpr, $someDocNode)
($someDocNode//patExpr)[Expr = someExpr]
  <xsl:key name='kNameByVal' match='Name' use='.'/>
key('kNameByVal', 'Peter', $doc)
$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]
}
}