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()