2012-05-15 3 views
3

Я хотел бы извлечь только часть текста из td, например «FLAC». Как это можно сделать с помощью XPath?XPath - Как извлечь определенную часть текста из одного текстового узла

Я пробовал // текст() [содержит (., 'FLAC')], но он возвращает мне весь текст.

    <tr> 
         <td class="left">Format plików</td> 
         <td> 
                   AVI, FLV, RM, RMVB, FLAC, APE, AAC, MP3, WMA, OGG, BMP, GIF, TXT, JPEG, MOV, MKV, DAT, DivX, XviD, MP4, VOB 
                 </td> 
        </tr> 
+1

Вы уже знаете, что текстовый узел содержит «FLAC» - почему тогда вы его извлечете? Просто используйте строку «FLAC» - я действительно не понимаю, что вы хотите сделать ... –

+0

Я знаю, что текстовый узел содержит «FLAC», но дело в том, что я хочу извлечь только это конкретное слово из этого текста узел не весь узел. –

+3

Но * почему * извлечь его из узла, когда у вас уже есть буквальная строка? –

ответ

6

Вы должны определить, где в дереве первым, и так как у вас есть несколько <td> элементов сначала нужно найти узел, содержащий текст.

substring(//tr/td[contains(@class, 'left')]/following-sibling::text()[1], startIndex, length) 

или

substring(//tr/td[@class='left']/following-sibling::text()[1], startIndex, length) 

Обновление в соответствии с комментариями:

T/F содержит (// тр/тд [@ класс = 'левый']/следующее-родственный :: текст() [1], 'FLAC')

Это даст вам T/F для элемента-брата, после которого будет слово «FLAC». Вы можете использовать substring() для захвата подмножества этой строки, но это только в статических случаях. Я бы предложил использовать другой метод, например XSLT, для изменения/разделения строки. Надеюсь, это поможет!

Update 2

substring('FLAC',1,4*contains(//tr/td[@class='left']/following-sibling::text()[1], 'FLAC')) 

это вернет FLAC, если FLAC присутствует в узле вы проверяющий, и пустой, если не ....

Шаг за шагом разбивка:

  1. //tr/td[@class='left'] - Это возвращает ALL<td> узлов, имеющие атрибут «класс» установлена ​​на «левые»

  2. /following-sibling::text() - Это возвращает текст всех узлов после Узла выше.

  3. Добавление [1] возвращает первый узел из списка выше.

  4. Обертка этого содержит (вышеValue, 'FLAC') вернет TRUE (или 1 в этом примере), если в тексте присутствует «FLAC», а False (0), если это не так.

  5. Обертка всего этого в подстроке ('FLAC', 1,4 * aboveValue) является эквивалентом If/Then/Else в XPath 1.0, поскольку для этого нет встроенной функции: Если присутствует «FLAC», потяните подстроку 1,4 * (true = 1) = 4, которая представляет собой целую строку. Если «FLAC» нет, потяните подстроку 1,4 * (false = 0) = 0, которая не является ни строкой.

Другая вещь, которую следует отметить, содержит() чувствительна к регистру, поэтому, если это поле может иметь «flac», оно вернет false.Чтобы проверить все смешанные смеси FLAC, используйте translate(), example here.

+0

XPath из второго обновления работает в моем случае. Если я могу задать вам еще одну вещь - можете ли вы объяснить этот шаг шаг за шагом? Благодарим вас за терпение и помогите разобраться в этом. –

+0

Несомненно! Я скоро обновлю ответ – JWiley

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