2010-04-23 87 views
9

比方说,我有一个完整的html文档作为XML输入。
如果我只想输出HTML中的第一个(或任何)图像,XSLT文件将如何显示?XSLT获取特定标记的第一个匹配项

+0

你有什么迄今得到?什么不起作用? – Oded 2010-04-23 12:29:38

+0

好问题(+1)。看到我的答案是迄今唯一正确的解决方案。 :) – 2010-04-23 13:03:41

回答

17

一个文档中选择第一个<img>元素的一个XPath表达式是:

(//img)[1]

请注意一个常见的错误 - 由@Oded在他的回答让是建议以下XPath表达式 - 通常它可以选择多个元素:

//img[1](:错误!!! :)

这将选择文档中的所有<img>元素,其中每一个元素都是其父元素的第一个子元素<img>

下面是这个常见的错误的确切的解释 - 在W3C XPath 1.0 Recommendation

注意:位置路径//para[1]并不意味着一样的位置路径/descendant::para[1]。后者选择第一个后裔para元素;前者选择所有后代para元素,这是他们父母的第一个孩子。

更进一步的问题存在如果文档已经定义了默认名称空间,这必须是XHTML的情况。 XPath将任何前缀名称归属于否命名空间和表达式(//img)[1]不选择节点,因为文档中没有属于的元素没有名称空间并且名称为img

在这种情况下,有指定想要的XPath表达式有两种方式:

  1. (//x:img)[1] - 其中前缀x关联(由主导语言)与特定默认namespcae(在这种情况下,该是XHTML命名空间)。

  2. (//*[name()='img'])[1]

+0

您的'错误'示例是否缺少'[1]'? – AakashM 2010-04-23 13:36:40

+0

@AakashM:谢谢,纠正。 – 2010-04-23 13:41:33

+1

很好的解释,很好的解决方案。 – Lobo 2012-12-12 08:34:02

2

XPath表达式将从HTML页面检索第一个图像:(//img)[1]

请参阅@Dimitre Novatchev的答案以获取有关问题的更多信息。

+0

请参阅我的回答,以解答与您的答案有关的问题。阅读XPath规范 - “//”缩写的定义,并搜索这个频繁的错误。如果问题仍然不清楚,请提出一个单独的问题,很多人会很乐意解释。 :) – 2010-04-23 13:02:47

+0

**这个答案是W R O N G ** !!!!!请参阅我的解答。 – 2010-04-23 13:18:06

+0

我绝对不想阅读XPath规范。但是我明白迪米特雷在说什么。 '// img [1]'将选择* any * parent的第一个img标签,而不是第一个文档。 – 2010-04-23 13:23:13

相关问题