我想从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>
答案 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,如果不存在,则返回空白....
逐步细分:
//tr/td[@class='left']
- 返回所有 <td>
节点,其属性“class”设置为“left”
/following-sibling::text()
- 在上述节点之后返回所有节点的文本。
添加[1]会从上面的列表中返回第一个节点。
如果文本中存在“FLAC”,则包含(aboveValue,'FLAC')将返回TRUE(在此示例中为1),如果不存在,则返回False(0)。
在子字符串中包含所有这些('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(),example here.