3

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

4

1 回答 1

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]
}

}

于 2012-12-10T01:13:53.670 回答