2013-06-21 84 views
0

我需要從一個包含屬性詳細信息的網站中取消信息。xpath訪問節點中的信息

<div class="inner"> 
<div class="col"> 
    <h2><a href="house-in-digana-for-sale-kandy-32">House in Digana </a></h2> 
    <div class="meta"> 
     <div class="date"></div> 
     <span class="category">Houses</span>, 
    <span class="location">Kandy</span> 
    </div> 
</div> 
    <div class="attr polar"> 
    <span class="data">Rs. 3,600,000</span> 
    </div> 

什麼是 「康提」 和 「Rs。3600000」 XPath格式?

回答

3

這是不明智的地址文本節點直接使用text()因爲XML文檔中的細微之處。

相反,解決一個元素節點直接返回的元素值,也就是人們通常想要的(並認爲當他們處理文本節點,他們所得到)所有後代文本節點的連接。

我在課堂上使用的典型的例子是OCR'ed含量爲XML的該實施例中:

<cost>39<!--that 9 may be an 8-->.22</cost> 

使用XPath地址cost的元素的值是「39.22」,但在XSLT 1.0的XPath地址cost/text()的值是「39」,它不完整。在XSLT 2.0中(這是問題的標記方式),您會得到兩個文本節點「39」和「.22」,如果將它們連接起來看起來正確。但是,如果將它們傳遞給需要單例參數的函數,則會出現運行時錯誤。當你訪問一個元素時,返回的文本被連接成一個單獨的字符串,這個字符串適合單例參數。

我告訴學生,在我所有的專業工作中,只有非常(很!)幾次,我必須在我的樣式表中使用text()

所以//span[@class='location' or @class='data']會發現這兩個領域,如果這些人在整個文檔中唯一的此類元素。您可能需要使用文檔樹內某個位置的「.//span」。

+0

你的開發是正確的,一個很好的(!),但可以很容易被誤解。 「在XSLT 1.0中,XPath地址開銷/ text()的值是」39「_」是**的**值。即使在xpaht-1.0中,cost/text()的XPATH結果也是所有直接子文本節點的列表。其中'xsl:value-of'將只返回第一個,但'copy-of'將返回全部。 –

+0

謝謝你,hr_117,是的。我假設最初的海報大部分都是使用。但是我對XSLT 2.0的警告肯定會適用:如果將XPath地址用作像contains()這樣的函數的第一個參數,那麼會有運行時錯誤,因爲第一個參數不是單例。我告訴學生的觀點是「如果你認爲你需要使用'text()',那麼再想一想,因爲你可能不會」 –

+0

在XSLT 1中更多地考慮這個''contains(cost,'2') '返回true,'contains(cost/text(),'2')'返回false,並且在XSLT 2中,contains(cost/text(),'2')'返回運行時錯誤,並且轉換異常終止。 –