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()ノードのシーケンスを返し、本体が上記の式である関数を宣言する必要があります (名前は 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]
}

}

于 2012-12-10T01:13:53.670 に答える