【问题标题】:XPath - How to extract specific part of the text from one text nodeXPath - 如何从一个文本节点中提取文本的特定部分
【发布时间】:2012-05-16 02:46:53
【问题描述】:

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

【问题讨论】:

  • 您已经知道文本节点包含“FLAC”——为什么还要提取它?就用字符串“FLAC”——我真的不明白你想做什么......
  • 我知道文本节点包含“FLAC”,但问题是我只想从这个文本节点中提取这个特定的单词而不是整个节点。
  • 但是为什么当你已经将它作为文字字符串从节点中提取它?
  • 好的,我来解释一下。我在工作中有一项新任务,我需要在其中使用 XPath。这个特殊的 XPath 应该这样工作:“如果在节点 中,它是节点 的兄弟节点,出现单词“FLAC”,然后提取这个单词”。我希望现在很清楚。如果没有,对不起-我是这个主题的初学者。
  • 不过,这并不是您的问题真正要问的,当您最初发布问题时,请尽可能详细地说明问题,以便在 cmets 中没有不必要的来回。

标签: xpath


【解决方案1】:

您必须首先指定树中的位置,并且由于您有多个 &lt;td&gt; 元素,您首先要查找包含文本的节点。

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

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

更新根据 cmets:

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'] - 这将返回 ALL &lt;td&gt; 将属性“class”设置为“left”的节点

  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(), example here.

【讨论】:

  • 第二次更新的 XPath 在我的情况下有效。如果我可以再问你一件事 - 你能逐步解释这个查询吗?感谢您的耐心和帮助解决问题。
猜你喜欢
相关资源
最近更新 更多
热门标签