xslt キー関数を Xquery 関数に変換したい。誰でもこれで私を助けることができますか?
xsl:key
指示がある場合:
<xsl:key name='someName' match="patExpr" use="Expr"/>
key()
および関数の呼び出し:
key('someName', someExpr, $someDocNode)
これは次と同等です:
($someDocNode//patExpr)[Expr = someExpr]
したがって、特定のキーに対して、my:keySomeName()
ノードのシーケンスを返し、本体が上記の式である関数を宣言する必要があります (名前は it )。
例:
このxsl:key
指示がある場合:
<xsl:key name='kNameByVal' match='Name' use='.'/>
そして、このkey()
関数への呼び出し:
key('kNameByVal', 'Peter', $doc)
対応する XQuery 関数は、次の本体を持ちます。
$doc//Name[. = 'Peter']
関数の 2 番目のオペランドがkey()
より複雑な式である場合、その式を計算する関数を 2 番目の引数としてキー実装関数に渡す必要があります (したがって、これは 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]
}
}