Выражение XPath
Этот вопрос касается выражений XPath.
Я хочу найти среднее значение длины всех URL-адресов на веб-странице, которые указывают на файл .pdf.
До сих пор я построил следующее выражение, но оно не работает:
sum (строка-длина (строка (//a/@href[содержит (., ".pdf")]))) div count(//a/@href[содержит (., ".pdf")])
Любая помощь будет оценена!
2 ответа
Вам понадобится XPath 2.0.
Для расчета суммы длин строк вам понадобится либо
- нужна объединенная строка всех
@href
s применить кstring-lenght($string as xs:string)
(который допускает только одну строку в качестве параметра), ноconcat(...)
принимает только произвольное количество строк атома, а не их последовательность; или же - применять
string-length(...)
для каждого @href, как предлагал @Navin Rawat, - но использование произвольных функций в шагах оси является новой функцией XPath 2.0.
Если используется XPath 2.0, есть функции avg(...)
а также ends-with(...)
которые помогут вам в сокращении выражения до
avg(//a/@href[ends-with(., '.pdf')]/string-length())
Если вам нужно придерживаться XPath 1.0, все, что вы можете сделать, это использовать мое выражение ниже, чтобы получить URL-адреса и вычислить среднее значение вне XPath.
В любом случае предложенное вами подвыражение не будет работать на URL-адресах, таких как http://example.net/myfile.pdf.txt
, Сравните только конец URL:
//a[@href[substring(., string-length(.) - 3) = '.pdf']]/@href
И вы пропустили шаг пути для атрибута, поэтому вы пытались усреднить длину строки в именах ссылок прямо сейчас.
Пожалуйста, поставьте что-то вроде:
sum(//a/@href[contains(.,'.pdf')]/string-length()) div count(//a/@href[contains(.,'.pdf')])