Использование substring-after для поиска текста в запросе XPath - PullRequest
3 голосов
/ 19 октября 2010

Я пытаюсь проанализировать строку в узле XML с помощью запроса XPath, который требует, чтобы я удалил подстроку и прочитал оставшееся значение. Подстрока может иметь динамическое количество пробелов до и после нее, прежде чем я смогу получить значение, поэтому было бы полезно иметь какую-то функцию indexOf для использования в XPath. Я пытаюсь использовать substring-after, но есть большая вероятность, что XPath равен 1.0, что в соответствии с этим постом может затруднить достижение этого. Ниже приведен пример XML, который я пытаюсь проанализировать:

<root>
   <myField>     StringToParse        7</myField>
</root>

Я пытаюсь получить значение 7 в строке, что может показаться возможным при некоторой комбинации substring-after и normalize-space. Я не совсем уверен, что я использую это правильно, потому что независимо от того, каким образом я пытаюсь его использовать, результатом является либо нулевое значение, либо вся строка, при этом подстрока не удаляется.

Способ, которым я могу вернуть все значение (меньшее из двух зол):

/myField[substring-after(.,'StringToParse')]

который, я надеюсь, вернет '7' Может ли кто-нибудь дать мне знать, что я ошибаюсь в синтаксисе, или если есть альтернативный метод, который я должен использовать для достижения того, чего я хочу?

Спасибо

Mike

1 Ответ

4 голосов
/ 19 октября 2010

Способ, которым я могу вернуть все значение (меньшее из двух зол): /myField[substring-after(.,'StringToParse')], который, я надеюсь, вернет '7' Может кто-нибудь дать мне знать, что я делаю неправильно

Вы близки, но есть как минимум две проблемы с выражением:

/myField[substring-after(.,'StringToParse')]

  1. myField isне верхний элемент в документе, и это выражение запрашивает, чтобы верхний элемент был выбран и чтобы имя этого элемента было myField.При сравнении с предоставленным XML-документом ни один узел не будет выбран, поскольку верхний элемент в предоставленном XML-документе называется root.

  2. Вызов функции substring-after() находится внутри предиката . Это означает, что верхний узел с именем myField должен быть выбран в зависимости от значения вызова substring-after(), преобразованного в логическое значение.Это именно то, что вы хотите - вам не нужен узел - вам нужна строка!

Решение :

substring-after(/*/myField, 'StringToParse')

оценивается как (без кавычек):

"        7"

Лучшее решение может быть :

normalize-space(substring-after(/*/myField, 'StringToParse'))

это оценивается просто:

"7"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...