Dictionary XPath 2.0:如何实现映射/哈希/关联数组
我有一个xpath 2.0表达式,它实现了映射/哈希/关联数组:Dictionary XPath 2.0:如何实现映射/哈希/关联数组,dictionary,xpath,hashmap,associative-array,xpath-2.0,Dictionary,Xpath,Hashmap,Associative Array,Xpath 2.0,我有一个xpath 2.0表达式,它实现了映射/哈希/关联数组: 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表达式
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>
xpath将是:
doc('cfg.xml')/cfg/map/*[ name() eq $mykey ]
注意:如果key1、key2等以数字开头,只需在xml中添加一个非数字字符(例如“k”),并按照以下步骤修改xpath:
doc('cfg.xml')/cfg/map/*[ name() eq concat('k',$mykey) ]
若干建议:
substring-after(('key1:val1', 'key2:val2')[starts-with(concat($key, ':'))], ':')
索引。在XQuery中,您可以执行以下操作
let $seq := ('key1', 'val1', 'key2', 'val2')
let $key := 'key1'
return $seq[index-of($seq, $key) + 1]
但是在XPath2.0中,不允许使用let
,并且for
hack不能处理序列。您必须重复以下顺序:
('key1', 'val1', 'key2', 'val2')[index-of(('key1', 'val1', 'key2', 'val2'), 'key1') + 1]
但将其分为两个序列可能更合理:
('val1', 'val2')[index-of(('key1', 'key2'), 'key1')]
如果您有权访问XPath 3.0或XQuery 1.0或3.0,您可以使用两个函数编写自己的映射实现,并操作包含键值对的XML文档。Jens:我不喜欢第一个,因为它需要添加新文件(XML),我不喜欢第三个,因为它需要重复键值对列表,或者需要将键列表和值列表分开(这样就可以将这些对的轨迹松开50对)。所以我尝试了第二个,但它不起作用,因为start-with()函数需要两个参数(它不是上下文函数)。可能解决方案是将键/值对列表作为参数重复到函数中,但这会将第二个建议转换为糟糕的解决方案。我将尝试第一个建议。adamretter:Xpath表达式将是XSD1.1文档中的断言,因此只有XPath2.0可用。我在尝试Jen的第一个建议。我在使用Jens Erat的建议#1。请参见问题中的“更新”部分。
('val1', 'val2')[index-of(('key1', 'key2'), 'key1')]