XPath - Как извлечь определенную часть текста из одного текстового узла

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

Я пытался // text () [содержит (., "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>
 Mateusz Malinowski15 мая 2012 г., 15:12
Я знаю, что текстовый узел содержит "FLAC" но дело в том, что я хочу извлечь из этого текстового узла только это конкретное слово, а не весь узел.
 Dimitre Novatchev15 мая 2012 г., 15:08
Вы уже знаете, что текстовый узел содержит & quot; FLAC & quot; - зачем тогда ты это извлек? Просто используйте строку & quot; FLAC & quot; - Я действительно не понимаю, что вы хотите сделать ...
 Dimitre Novatchev15 мая 2012 г., 15:14
Ноwhy извлечь его из узла, когда у вас уже есть литеральная строка?
 Mateusz Malinowski15 мая 2012 г., 15:44
Хорошо, я попытаюсь объяснить. Я получил новое задание на работе, и мне нужно использовать XPath в нем. Этот конкретный XPath должен работать следующим образом: «Если в узле & lt; td & gt ;, который является родственным узлом & lt; td class =" left ", & gt; появляется слово «FLAC» затем извлеките это слово & quot ;. Я надеюсь, что теперь это ясно. Если нет, извините, я новичок в этом вопросе.
 JWiley15 мая 2012 г., 15:48
Это не совсем то, что задавал ваш вопрос, хотя, когда вы изначально публикуете вопрос, укажите как можно больше подробностей, чтобы в комментариях не было необходимости возвращаться назад и вперед.

Ответы на вопрос(1)

Решение Вопроса

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

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

или же

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

Update согласно комментариям:

T / F     содержит (// tr / td [@ class = 'left' '] / follow-sibling :: text () [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 присутствует в узле, который вы проверяете, и пустым, если нет ....

Step-by-step breakdown:

//tr/td[@class='left'] - This returns ALL <td> nodes which have an attribute "class" set to "left"

/following-sibling::text() - This returns all nodes' text after the node above.

Adding [1] returns the first node from the list above.

Wrapping this in contains(aboveValue, 'FLAC') will return TRUE(or 1, in this example), if 'FLAC' is present in the text, and False(0) if it is not.

Wrapping all of this in substring('FLAC',1,4*aboveValue) is the equivalent of an If/Then/Else in XPath 1.0, since there isn't a built-in function to do so: If 'FLAC' is present, pull the substring 1,4*(true=1)=4, which is the whole string. If 'FLAC' is not present, pull the substring 1,4*(false=0)=0, which is none of the string.

Еще одна вещь, которую нужно отметить, в методе contains () учитывается регистр, поэтому, если в этом поле может быть "flac", quot; он вернет ложь. Чтобы проверить все сочетания случаев FLAC, используйте translate (),пример здесь.

 15 мая 2012 г., 20:35
Конечно! Я скоро обновлю ответ
 Mateusz Malinowski15 мая 2012 г., 20:32
XPath из второго обновления работает в моем случае. Если я могу спросить вас еще об одном - можете ли вы объяснить этот запрос шаг за шагом? Спасибо за терпение и помогите разобраться.

Ваш ответ на вопрос