XSLT获取特定标记的第一个匹配项

XSLT获取特定标记的第一个匹配项,xslt,Xslt,假设我有一个完整的html文档作为XML输入 如果我只想从html输出第一个(或任何)图像,XSLT文件会是什么样子?表达式将从html页面检索第一个图像:(//img)[1] 有关问题的更多信息,请参见来自@Dimitre Novatchev的答案。选择文档中第一个元素的一个XPath表达式是: (//img)[1] 请注意一个常见的错误是建议使用以下XPath表达式,@Oded在其回答中指出,通常它可能会选择多个元素: //img[1](:错!!!:) 这将选择文档中的所有元素,每个元素都是

假设我有一个完整的html文档作为XML输入
如果我只想从html输出第一个(或任何)图像,XSLT文件会是什么样子?

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


有关问题的更多信息,请参见来自
@Dimitre Novatchev
的答案。

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

(//img)[1]

请注意一个常见的错误是建议使用以下XPath表达式,
@Oded
在其回答中指出,通常它可能会选择多个元素:

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

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

以下是对这一常见错误的确切解释,具体如下:

注意:位置路径
//para[1]
与位置路径
/genderant::para[1]
的含义不同。后者选择第一个子
para
元素;前者选择所有子代
para
元素,这些元素是其父代的第一个para子代

如果文档定义了默认名称空间,则存在另一个问题,XHTML必须是这样。XPath将任何不固定的名称视为不属于任何命名空间,表达式
(//img)[1]
不选择任何节点,因为文档中没有不属于任何命名空间且具有名称
img
的元素

在本例中,有两种方法可以指定所需的XPath表达式:

  • (//x:img)[1]
    ——其中前缀
    x
    与特定的默认名称PCAE关联(在本例中,这是XHTML名称空间)

  • (//*[name()='img'])[1]


  • 到目前为止你得到了什么?什么不起作用?好问题(+1)。请参阅我的答案,了解目前为止唯一正确的解决方案。:)请参阅我的答案,以了解您的答案对问题的解释。阅读XPath规范——
    /
    缩写的定义,并搜索此常见错误。如果问题仍然不清楚,请另提一个问题,许多人都会乐于解释。:)我当然不想阅读XPath规范,但我明白Dimitre的意思。
    //img[1]
    将选择任何父项的第一个img标记,而不是文档的第一个。@Dimitre Novatchev-感谢您的更正。答案更新。很好的解释,很好的解决方案。谢谢你,我花了几个小时试图找出我的问题出在哪里。