2013-09-24 78 views
2

我有以下列格式的XML文檔:最快XPath表達式:value-of的

<Contents> 
    <Content Name="ClientXML"> 
    <EntityData> 
     <Data Name="EQ_EligibleForGuaranteedIssue">Yes</Data> 
     <Data Name="ABRInd">NO</Data> 
     <Data Name="AC_AgentNo">12345</Data> 
     <Data Name="AC_AgentPersonallyMetWithApplicant">Has</Data> 
     <Data Name="AC_City">Pomona</Data> 
     <Data Name="AC_FirstName">Kimmy</Data> 
     <Data Name="AC_FullName">Kimmy N Jackson</Data> 
     <Data Name="AC_Initials">K J</Data> 
     <Data Name="AC_LastAndSuf">Jackson</Data> 
     ... 
    </EntityData> 
    </Content> 
    <Content Name="UserXML"> 
    <EntityData> 
     <Data Name="TransRefGUID">789-456-123456789-456</Data> 
     ... 
    </EntityData> 
    </Content> 
</Contents> 

其他信息:

  1. 可以有下的每個幾千 '數據' 節點' EntityData'對象
  2. 任何「名稱」屬性的值都不會重複。

我必須創建一個XSL轉換,並使用xsl:value-select =「...」函數。我的問題是,什麼XPath表達式將執行最快?例如

<xsl:value-of select="\\Contents\Content[@Name="ClientXML"\EntityData\Data[@Name=".."]"> 

或者乾脆

<xsl:value-of select="\\Data[@Name=".."]"> 

我沒有訪問到高端服務器,這將最終運行這個過程,並在本地第二個選項可能會出現快一點。

想知道如果任何人有意見,並在更大的規模,如果一個可能會更快。

謝謝!

回答

3

在XSLT使用密鑰將遠遠大於XPath表達式更快,尤其是一個與//它可以是要執行非常緩慢,只應必要時使用。

<xsl:key match="Content" use="@Name" name="MyContentsLookup"/> 
... 
<xsl:value-of select="key('MyContentsLookup','ClientXML')"/> 

XSLT處理器可以實現內部搜索機制,以快速查找值幾萬項,遠遠高於使用XPath更快。

我發表XSLT鍵這裏的概述:http://www.CraneSoftwrights.com/resources/xslkeys/index.htm

+0

這個迴應確實是最快的。但是,如果有一個情況下,你正在使用select = XSL功能的價值,我是能夠運行一個測試: 的完整路徑:/內容/內容[@名稱=「ClientXML」]/EntityData /數據[@名稱= $名稱] 比短路徑要快得多: //數據[@名稱= $名稱] –

+0

沒錯。這是我的觀點。 ''//可能會很慢。這是因爲您要求處理器在文檔中的任何位置都查找正在處理的項目,並且處理器在找到您正在查找的項目時不知道要停止。然而,當你清楚完整的XPath地址時,處理器不會在別處尋找不必要的東西。因此,您的較長表達式執行得更快。畢竟,我們應該花費額外的時間來快速完成代碼,而不是不必要地使用快捷方式。 –

0

當你說永遠不會重複名稱的內容,是在文檔真正作爲一個整體,或僅在每個內容元素?如果它在全球範圍內是真的,那麼Ken的鍵技術是理想的。如果僅在本地是真的,則可能需要考慮設置一個將Content/@ Name與EntityData/@ Name結合的密鑰。

其他的事情要記住的是,性能取決於你的處理器。實現者有很大的自由來以不同的方式優化相同的表達式。即使在同一個產品系列,撒克遜-EE將從撒克遜-HE實現它的方式很不同的執行表達(實際上,撒克遜-EE自動在需要的地方,而不需要你手工創建它們創建密鑰)。所以你不能問性能問題,除非與具體實施有關。