XPath - 如何从一个文本节点中提取文本的特定部分

Mat*_*ski 3 xpath

我想从td中仅提取文本的一部分,例如"FLAC".如何使用XPath完成?

我试过// text()[contains(.,'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>
Run Code Online (Sandbox Code Playgroud)

JWi*_*ley 9

您必须首先指定树中的位置,并且由于您有多个<td>元素,因此首先要查找包含文本的节点.

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

要么

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

根据评论更新:

T/F包含(// tr/td [@ class ='left']/follow-sibling :: text()[1],'FLAC')

这将为您提供兄弟元素的T/F,之后会出现"FLAC"字样.您可以使用substring()来获取该字符串的子集,但这只是在静态情况下.我建议使用不同的方法,如XSLT来改变/分离字符串.希望这可以帮助!

更新2

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

如果FLAC出现在您正在检查的节点中,这将返回FLAC,如果不是,则返回空白....

逐步细分:

  1. //tr/td[@class='left']- 返回属性"class"设置为"left"的所有 <td>节点

  2. /following-sibling::text()- 这将返回上述节点之后的所有节点文本.

  3. 添加[1]将返回上面列表中的第一个节点.

  4. 包裹在此包含(aboveValue,"FLAC")将返回TRUE(或图1,在本实施例中),如果"FLAC"存在于文本,和假(0),如果它不是.

  5. 将所有这些包含在子字符串('FLAC',1,4*aboveValue)中相当于XPath 1.0中的If/Then/Else,因为没有内置函数可以这样做:如果'FLAC'是当前,拉子串1,4*(true = 1)= 4,这是整个字符串.如果'FLAC'不存在,则拉出子串1,4*(false = 0)= 0,这不是字符串.

另外需要注意的是,contains()区分大小写,所以如果这个字段可以有"flac",它将返回false.要检查FLAC的所有案例混合,请使用translate(),此处示例.