我有一个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) ]
几个建议:
一个显而易见的但有点怪异的解决方案是使用字符串操作,例如。
substring-after(('key1:val1', 'key2:val2')[starts-with(concat($key, ':'))], ':')
使用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] 删除。
我来说两句