2010-04-23 88 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

相關問題