2009-09-03 162 views
0

我是新來使用XPath,所以我一直在愚弄XPath Evaluator,我試圖找出如何返回函數的值。如何使用XPath返回函數的結果?

如果我想返回一個頁面,我可以使用下面的XPath的href S中所有環節的:如果我想與href小號超過20個字符返回的所有環節

//a/@href 

我可以使用此:

//a[string-length(@href) > 20] 

我無法弄清楚什麼是我該如何得到所有href S的只是長度? 我天真的假設是,這應該這樣做:

//a/string-length(@href) 

但它失敗(如做所有我能想到的變化)。

這怎麼辦?


在比特挖經過進一步我看到XPath計算器我使用硬編碼XPathResult.ORDERED_NODE_SNAPSHOT_TYPE作爲結果類型,當我改成ANY_TYPE(0)以下工作用於獲取一條鏈路的長度(這是我實際需要的)

string-length((//a)[1]/@href) 

回答

1

您正在嘗試查找多個字符串的長度。我可以想到兩種可能的方法:

嘗試將函數放在查詢路徑之外。現在我猜測它失敗了,因爲你在說「去這個節點」,並且這個節點的一部分是一個函數。試試這個:

string-length(//a/@href) 

但我仍然不認爲你會得到你想要的,這是每個URL的長度。我可能是錯的,但爲了以防萬一,您可能需要考慮首先查找所有hrefs,然後遍歷結果並使用函數獲取每個hrefs的長度。像

urls = //a/@href 

foreach (urls as url) { 
    if (string-length(url) > 20) 
     ....blah blah blah.... 
} 

您可能試圖避免循環,但獲取所有hrefs,然後使用條件可能幾乎一樣有效。

+0

我嘗試了您的第一個建議(作爲*我可以想到的所有變體的一部分*),並且它不起作用。 – Motti 2009-09-03 12:57:20

+0

根據其他答案,我認爲它不會。抱歉。我不確定把查詢之外的函數放在你的許多變體之中,所以我認爲它可能是那些「哦,哦」類的東西之一。出於好奇,你最終使用XPath哪種語言? PHP應該很容易使用simplexml擴展來實現一個循環函數。 – Anthony 2009-09-03 13:19:12

1

XPath主要用於選擇不返回標量值的節點。 XPath中標量函數的存在有助於創建謂詞條件,並可用於XSLT來提供輸出值。然而,大多數支持XPath的DOM實現僅支持所選節點的返回。

+0

特別是字符串長度很容易在「外部」環境中確定... – Tomalak 2009-09-03 12:01:22

0

你不能。函數用於進一步指定所需的節點(即,我希望所有tt - 具有多於3個屬性的節點)。但是由於xpath查詢通常會返回節點對象,因此您可以使用您在xpath中使用的語言輪詢它們的屬性

0

您需要遍歷//a[string-length(@href) > 20]的結果,完全取決於您計劃使用查詢的語言。