XPath 2.0:如何实现map / hash / associative_array

自由软件

我有一个xpath 2.0表达式,它实现了map / hash / associative_array:

if ($mykey eq 'key1') then 'val1'  
else if ($mykey eq 'key2') then 'val2'  
else if ($mykey eq 'key3') then 'val3'  
else if ($mykey eq 'key4') then 'val4'  
...
(same for 50 key/value pairs)

有更紧凑的方法吗?(地图是更长的xpath表达式的一部分)

我已经通过将成对的序列分配给变量来尝试了一些技巧:

for $seq in ('key1', 'val1', 'key2', 'val2' ...) return
    <some trick to access only keys and then the associated value>

但它没有将序列分配给$seq,而是在序列中的每个值上循环。


更新:解决:我正在使用Jens Erat的建议#1:使用映射创建一个外部xml。例如,对于此xml(cfg.xml):

<cfg>
    <map>
        <key1>val1</key1>
        <key2>val2</key2>
        <key3>val3</key3>
        ...
    </map>
</cfg>

xpath将是:

doc('cfg.xml')/cfg/map/*[ name() eq $mykey ]

注意:如果key1,key2等以数字开头,则只需在xml中添加非数字char(例如“ k”),并相应地修改xpath:

doc('cfg.xml')/cfg/map/*[ name() eq concat('k',$mykey) ]
詹斯原为

几个建议:

  1. 可能最合理的方法是使用键/值对将数据放入某个XML文档中,然后仅查询该文档。
  2. 一个显而易见的但有点怪异的解决方案是使用字符串操作,例如。

    substring-after(('key1:val1', 'key2:val2')[starts-with(concat($key, ':'))], ':')
    
  3. 使用index-of在XQuery中,您将执行以下操作

    let $seq := ('key1', 'val1', 'key2', 'val2')
    let $key := 'key1'
    return $seq[index-of($seq, $key) + 1]
    

    但是在XPath 2.0中,let不允许这样做,并且该for破解不适用于序列。您将不得不重复该序列:

    ('key1', 'val1', 'key2', 'val2')[index-of(('key1', 'val1', 'key2', 'val2'), 'key1') + 1]
    

    但是,将其分为两个序列可能更合理:

    ('val1', 'val2')[index-of(('key1', 'key2'), 'key1')]
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章