Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary XPath 2.0:如何实现映射/哈希/关联数组_Dictionary_Xpath_Hashmap_Associative Array_Xpath 2.0 - Fatal编程技术网

Dictionary 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表达式

我有一个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表达式的一部分)

我尝试了一些技巧,将成对序列分配给变量:

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) ]
若干建议:

  • 最合理的方法可能是将数据放入具有键/值配对的XML文档中,然后查询该文档
  • 一个显而易见但相当老套的解决方案是使用字符串操作,例如

    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')]