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

3

Я хотел бы извлечь только часть текста из 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>
Хорошо, я попытаюсь объяснить. Я получил новое задание на работе, и мне нужно использовать XPath в нем. Этот конкретный XPath должен работать следующим образом: «Если в узле & lt; td & gt ;, который является родственным узлом & lt; td class =" left ", & gt; появляется слово «FLAC» затем извлеките это слово & quot ;. Я надеюсь, что теперь это ясно. Если нет, извините, я новичок в этом вопросе. Mateusz Malinowski
Это не совсем то, что задавал ваш вопрос, хотя, когда вы изначально публикуете вопрос, укажите как можно больше подробностей, чтобы в комментариях не было необходимости возвращаться назад и вперед. JWiley
Вы уже знаете, что текстовый узел содержит & quot; FLAC & quot; - зачем тогда ты это извлек? Просто используйте строку & quot; FLAC & quot; - Я действительно не понимаю, что вы хотите сделать ... Dimitre Novatchev
Я знаю, что текстовый узел содержит "FLAC" но дело в том, что я хочу извлечь из этого текстового узла только это конкретное слово, а не весь узел. Mateusz Malinowski
Ноwhy извлечь его из узла, когда у вас уже есть литеральная строка? Dimitre Novatchev

Ваш Ответ

1   ответ
7

где в вашем дереве, и так как у вас есть несколько<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 (),пример здесь.

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

Похожие вопросы