【问题标题】:Xquery function for Xslt key functionXslt key 函数的 Xquery 函数
【发布时间】:2012-12-09 23:54:35
【问题描述】:

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

【问题讨论】:

    标签: xquery


    【解决方案1】:

    如果我们有 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]
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      相关资源
      最近更新 更多