XPath 1.0 - Как я могу получить минимальное значение при выборе элементов?

Пример файла (упражнение на основе файла itunes xml):

<plist version="1.0">
<dict>
    <key>Major Version</key><integer>1</integer>
    <key>Minor Version</key><integer>1</integer>
    ...
    <dict>      
        <key>219</key>
        <dict>
            <key>Track ID</key><integer>219</integer>
            <key>Name</key><string>Ruby</string>
            ...
            <key>Track Number</key><integer>1</integer>
            <key>Track Count</key><integer>11</integer>
            <key>Year</key><integer>2010</integer>
            <key>Date Modified</key><date>2010-08-28T10:16:04Z</date>
            <key>Date Added</key><date>2010-08-30T19:40:27Z</date>
            ...
        </dict>
        <key>243</key>
        <dict>
            <key>Track ID</key><integer>223</integer>
            <key>Name</key><string>No More Mr Nice Guy</string>
            ...
            <key>Track Number</key><integer>1</integer>
            <key>Track Count</key><integer>11</integer>
            <key>Year</key><integer>2005</integer>
            <key>Date Modified</key><date>2010-08-28T10:17:54Z</date>
            <key>Date Added</key><date>2010-08-30T20:14:13Z</date>
            ...
        </dict>

(Мне нужно использовать XPath 1.0) Мне нужно получить имя самого старого трека (ов) (сравнивая элемент Year), но я не знаю, как получить минимальный год, после того как выполнил запрос на получение года элемент:

/plist/dict/dict/dict/integer[./preceding-sibling::key="Year"][1]

Есть кто-нибудь, кто может мне помочь?

Спасибо!

2 ответа

Многие (но не все) процессоры XSLT поддерживают часть или всю библиотеку функций расширения EXSLT. Это включает в себя как miniumum а также lowest функции. Смотрите http://exslt.org/math/functions/min/

Без EXSLT вам понадобится использовать именованный шаблон в качестве подпрограммы. Страница EXSLT также иллюстрирует это.

Я не знаю решения XPath 1.0. В XPath 1.0 отсутствует такая важная функциональность, как fn:min(), order by, так далее.

Вот решение XPath 2.0, в случае, если вы можете обновить:

/plist//dict
  [ key[. ="Year"]/following-sibling::integer/xs:integer(.) eq
    min(../dict/key[. ="Year"]/following-sibling::integer/xs:integer(.)) ]
  /key[. eq "Name"]/following-sibling::string/fn:string()
Другие вопросы по тегам