3

我只想从 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>
4

1 回答 1

11

您必须首先指定树中的位置,并且由于您有多个<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 包含(//tr/td[@class='left']/following-sibling::text()[1], 'FLAC')

这将为您提供同级元素的 T/F,其后有单词“FLAC”。您可以使用 substring() 来获取该字符串的子集,但这仅适用于静态情况。我建议使用不同的方法(例如 XSLT)来更改/分隔字符串。希望这可以帮助!

更新 2

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

如果您正在检查的节点中存在 FLAC,这将返回 FLAC,如果没有,则返回空白....

分步分解:

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

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

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

  4. 如果文本中存在“FLAC”,则将其包装在 contains(aboveValue, 'FLAC') 中将返回 TRUE(或在此示例中为 1),否则返回 False(0)。

  5. 将所有这些包装在 substring('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(),例如此处。

于 2012-05-15T12:21:57.477 回答