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

时间:2012-05-15 10:35:44

标签: 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>

1 个答案:

答案 0 :(得分:8)

您必须首先指定树中的位置,并且由于您有多个<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     contains(// 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'))

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

逐步细分:

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

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

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

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

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

  6. 另外需要注意的是,contains()区分大小写,因此如果此字段可以包含“flac”,则返回false。要检查FLAC的所有案例混合,请使用translate(),example here.