2009-09-03 4 views
0

Я новичок в использовании XPath, поэтому я обманывал с помощью XPath Evaluator, и я пытаюсь выяснить, как вернуть значение функции.Как вернуть результат функции с помощью XPath?

Если я хочу, чтобы вернуть href S всех ссылок на странице, я могу использовать следующее XPath:

//a/@href 

Если я хочу, чтобы вернуть все ссылки с href сек больше, чем 20 символов я могу использовать это:

//a[string-length(@href) > 20] 

То, что я не могу понять, как я могу получить только длины всех href с? Моя наивным предположение, что это следует сделать это:

//a/string-length(@href) 

Но это не удается (как и все вариации я мог думать о).

Как это можно сделать?


После того, как рыть в немного дальше я увидел, что в XPath оценщик я использовал жестко закодированы XPathResult.ORDERED_NODE_SNAPSHOT_TYPE как тип результата, когда я изменил его на ANY_TYPE (0) следующие работали для получения длины одного звена (это то, что мне действительно нужно)

string-length((//a)[1]/@href) 

ответ

1

Вы пытаетесь найти длину нескольких строк. Я могу думать о двух способах, которые могут сработать:

Попробуйте поместить функцию за пределы пути запроса. Сейчас я предполагаю, что это терпит неудачу, потому что вы говорите «перейдите на этот узел», а часть узла - это функция. Попробуйте это вместо этого:

string-length(//a/@href) 

Но я до сих пор не думаю, что вы получите то, что хотите, это длина каждого URL-адреса. Я мог ошибаться, но на всякий случай вам может потребоваться сначала найти все hrefs, затем прокрутить результаты и использовать функцию для получения длин каждого из них. Что-то вроде

urls = //a/@href 

foreach (urls as url) { 
    if (string-length(url) > 20) 
     ....blah blah blah.... 
} 

Вы, вероятно, пытается избежать зацикливания, но получать все hrefs, а затем с помощью условного может быть почти столь же эффективным.

+0

Я попробовал свое первое предложение (как часть * всех вариаций, о которых я мог думать *), и это не сработало. – Motti

+0

Основываясь на других ответах, я решил, что это не так. Сожалею. Я не был уверен, что размещение функции вне запроса было одним из ваших многочисленных вариантов, поэтому я подумал, что это может быть один из тех вещей, которые «о духе». Из любопытства, на каком языке вы используете XPath со временем? PHP должно быть очень просто реализовать функцию циклирования с использованием расширения simplexml. – Anthony

1

XPath предназначен, в первую очередь, для выбора узлов, не возвращающих скалярное значение. Существование скалярной функции в XPath помогает в создании предикатных условий и может использоваться в XSLT для подачи выходных значений. Однако большинство реализаций DOM, поддерживающих XPath, поддерживают только возврат выбранных узлов.

+0

Особенно длина строки легко определяется в «внешней» среде ... – Tomalak

0

Вы не можете. Существуют функции для дальнейшего определения нужных вам узлов (т. Е. Я хочу, чтобы все tt -ноды имели более 3-х атрибутов.) Но поскольку запросы xpath возвращают объекты узлов в целом, вы можете опросить их свойства на языке, которым вы пользуетесь xpath в

0

Вам нужно будет просмотреть результаты //a[string-length(@href) > 20], как полностью зависит от того, на каком языке вы планируете использовать запрос.

Смежные вопросы