Как найти значения с помощью файлов XQuery и plist XML

Следующий пример файла 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>

Итак, мой вопрос в том, что, поскольку это Plist (работающий с XCode), все ключи имеют имя элемента <key>, а значения могут быть, и т. д. Пара ключ-значение всегда находится рядом (прямые братья и сестры) ..

Есть ли способ с помощью XQuery получить значение для ключа? Как сказать retuenValueForKey(secondDictionary) для получения следующего?

<dict>
    <key>subDictionary</key>
    <dict>
        <key>aBoolValue</key>
        <false/>
    </dict>
</dict>

Моя основная ссылка на данный момент — это эта ссылка из W3Schools, но мне не удалось заставить ее работать правильно .


person Just a coder    schedule 19.04.2013    source источник


Ответы (1)


Вы можете сделать это в чистом 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>
person wst    schedule 19.04.2013
comment
Ok. Я делаю эту функцию, чтобы посмотреть, пойму ли я ее, но я сталкиваюсь с некоторыми ошибками. Работает ли эта функция у вас так же, как и в примере выше? edit Функция returnValueForKey(...) использует зарезервированное пространство имен. хорошо, позвольте мне немного повозиться с этим - person Just a coder; 20.04.2013
comment
Извините, да, функция должна быть в пространстве имен. Используйте фиксированный пример выше или используйте префикс пространства имен модуля, содержащего функцию, вместо local. - person wst; 20.04.2013
comment
Метод больше не выдает ошибки, но и результата не дает. Позже я расскажу о методах XQuery. Однако внутренний код метода работает --› //key[. = $key]/following-sibling::*[1]/self::dict ... Так что я помечаю это как правильное. Не могли бы вы объяснить, что означает последняя часть? --› self::dict - person Just a coder; 20.04.2013
comment
Конечно. self::dict выбирает узел контекста только если это словарь. В данном случае это скорее страховка. following-sibling::*[1] всегда будет брать следующий за ним родственный элемент, а self::dict гарантирует, что он вернет только словарь. Этот шаблон безопаснее, потому что following-sibling::dict вернет первый последующий словарь, независимо от того, является ли он элементом, непосредственно следующим за узлом контекста. - person wst; 20.04.2013