如何将字符串参数解析为 XQuery 中的映射整数?

How to resolve a string parameter to mapped integers in XQuery?

我需要将整数值而不是字符串映射到 XQuery 函数中的参数。例如:

有不同的选项,具体取决于您可以使用的 XQuery 版本。

鉴于您通常需要将 valueN 解析为 N,只需执行 substring-after($value, 'value')。在下文中,我假设这不是那么容易,并用字母替换了 12、...,以防止出现此类 "easy" 解决方案。对于任何示例,您都可以 return 整数而不是字符串。

XQuery 1.0 兼容

if-then-else-链

可能非常明显。

let $value := 'value1'
return
  if ($value eq 'value1')
  then 'A'
  else
    if ($value eq 'value2')
    then 'B'
    else 'default'

在 XML 代码段中查找

定义一个 XML 结构,您随后可以查询该结构的值。如有必要,添加 /string() 以获取节点的字符串值而不是 <value/> 元素。

let $map :=
  <values>
    <value id="value1">A</value>
    <value id="value2">B</value>
  </values>
let $value := 'value1'
return
  $map/value[@id=$value]

按顺序查找

可以将类似的解决方案应用于序列而不是外部 <values/> 元素,当然:

let $map := (
  <value id="value1">A</value>,
  <value id="value2">B</value>
)
let $value := 'value1'
return
  $map[@id=$value]

仅限 XQuery 3.0

使用 switch 语句

Switch 语句对于一堆固定值来说是一种非常优雅的方式。提取为函数可能会增加可读性。

let $value := 'value1'
return
  switch ($value)
  case 'value1' return 'A'
  case 'value2' return 'B'
  default return 'default'

使用地图

如果支持,XQuery 映射是一个非常强大的功能,也可用于查找值。

let $map := map {
  'value1': 'A',
  'value2': 'B'
}
let $value := 'value1'
return
  $map($value)