Выражение XPath

Этот вопрос касается выражений XPath.

Я хочу найти среднее значение длины всех URL-адресов на веб-странице, которые указывают на файл .pdf.

До сих пор я построил следующее выражение, но оно не работает:

sum (строка-длина (строка (//a/@href[содержит (., ".pdf")]))) div count(//a/@href[содержит (., ".pdf")])

Любая помощь будет оценена!

2 ответа

Решение

Вам понадобится XPath 2.0.

Для расчета суммы длин строк вам понадобится либо

  • нужна объединенная строка всех @hrefs применить к 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')])
Другие вопросы по тегам