如何使用XQuery和plist XML文件查找值

如何使用XQuery和plist XML文件查找值,xml,xsd,plist,xquery,basex,Xml,Xsd,Plist,Xquery,Basex,下面的示例Plist文件用于我下面的问题 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>firstDictionary<

下面的示例Plist文件用于我下面的问题

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>firstDictionary</key>
    <dict>
        <key>string</key>
        <string>someText</string>
        <key>anArray</key>
        <array>
            <string>first</string>
            <string>second</string>
        </array>
    </dict>
    <key>secondDictionary</key>
    <dict>
        <key>subDictionary</key>
        <dict>
            <key>aBoolValue</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

第一本字典
一串
一些文字
混乱

,但我无法使其正常工作。

您可以使用纯XPath进行操作,但如果您想将其封装在一个也可以正常工作的函数中:

declare function local:returnValueForKey(
  $key as xs:string,
  $plist as element(plist)
) as element(dict)?
{
   $plist//key[. = $key]/following-sibling::*[1]/self::dict
};

local:returnValueForKey('secondDictionary', <plist>...</plist>)
=>
<dict>
  <key>subDictionary</key>
  <dict>
    <key>aBoolValue</key>
    <false/>
  </dict>
</dict>
声明函数本地:returnValueForKey(
$key作为xs:string,
$plist作为元素(plist)
)作为元素(dict)?
{
$plist//key[..=$key]/以下同级::*[1]/self::dict
};
本地:returnValueForKey('secondDictionary',…)
=>
子词典
ABOLVALUE

ok。我正在做这个函数,看看我是否能理解它,但我遇到了一些错误。该函数是否与上面的示例plist一样适用于您?函数returnValueForKey(…)使用保留的命名空间。好的,让我来处理一下。对不起,是的,函数必须在名称空间中。使用上面的固定示例,或者使用包含函数的模块的名称空间前缀代替
local
。该方法不再给出错误,但不会给出结果。稍后我将讨论XQuery方法。但是,该方法的内部代码有效-->//key[.=$key]/以下同级::*[1]/self::dict。。。所以我认为这是正确的。你能解释最后一部分的意思吗?-->我确信<代码>self::dict
仅当它是dict时才选择上下文节点。在这种情况下,它更像是一份保险单
following sibling::*[1]
将始终使用紧跟其后的sibling元素,并且
self::dict
保证它只返回一个dict。此模式更安全,因为
following sibling::dict
将返回紧跟在上下文节点之后的第一个dict,无论它是否是上下文节点之后的元素。
declare function local:returnValueForKey(
  $key as xs:string,
  $plist as element(plist)
) as element(dict)?
{
   $plist//key[. = $key]/following-sibling::*[1]/self::dict
};

local:returnValueForKey('secondDictionary', <plist>...</plist>)
=>
<dict>
  <key>subDictionary</key>
  <dict>
    <key>aBoolValue</key>
    <false/>
  </dict>
</dict>