在XSLT轉換過程中,我遇到了一些性能和內存使用方面的麻煩。我瀏覽了幾個頁面如何優化XSLT,其中一種方法是減少使用node-set()
函數。什麼是更好的msxsl:node-set()或exsl:node-set()函數?
我發現在msxsl
和exsl
中有兩個節點集函數。這些功能在性能和內存使用方面有所不同嗎?
在XSLT轉換過程中,我遇到了一些性能和內存使用方面的麻煩。我瀏覽了幾個頁面如何優化XSLT,其中一種方法是減少使用node-set()
函數。什麼是更好的msxsl:node-set()或exsl:node-set()函數?
我發現在msxsl
和exsl
中有兩個節點集函數。這些功能在性能和內存使用方面有所不同嗎?
我不知道爲什麼你使用節點集在所有... Taken from this 12 year old post
「如果你還沒有已經猜到了,XSLT 2.0顯示RTFS的門,現在,當您使用XSL:變量創建實際上,在XPath 2.0中,它是一個真正的節點序列,它由一個文檔節點組成,XPath 2.0的名稱是XPath 1.0稱爲「根」節點「,然後使用該序列,可以使用路徑表達式在樹內向下鑽取,向其應用模板等等,就像使用任何其他源文檔一樣,使用XSLT 2.0時,不再需要節點集()擴展功能「。
Pure XSLT 1.0不提供將結果樹片段轉換爲節點集的方法,因此XSLT 1.0處理器必須爲該任務提供擴展功能。各種版本的Microsoft MSXML處理器提供名稱空間爲urn:schemas-microsoft-com:xslt
的本地名稱node-set
,文檔和許多示例將該名稱空間與前綴msxsl
綁定,以便使用示例請求msxsl:node-set($rtf-var)
。您可以使用任何其他前綴,但重要的是名稱空間,MSXML只能與名稱空間urn:schemas-microsoft-com:xslt
一起使用。
如我所知,在.NET框架中,XslTransform
類(現在已過時)也只支持該名稱空間`urn:schemas-microsoft-com:xslt
中的擴展功能node-set
。
然而,隨着EXSLT iniative現在報價爲EXSLT擴展功能,常被稱作exsl:node-set
但同樣重要的是名稱空間,而不是前綴支持標準化命名node-set
命名空間中的許多http://exslt.org/common
XSLT處理器的擴展功能。在.NET框架中,Microsoft的XslCompiledTransform
支持node-set
函數的兩個擴展函數命名空間,因此您可以選擇。功能沒有區別,我不知道有任何性能差異,我不認爲有一個,因爲我無法想象爲什麼不同的名稱應該導致不同的,更復雜的實現。
我寧願考慮你的樣式表需要哪種兼容性,如果你想用.NET和MSXML(例如Internet Explorer內部)運行它,那麼選擇命名空間urn:schemas-microsoft-com:xslt
,如果你想運行它。 NET和其他平臺上的XSLT處理器,那麼EXSLT命名空間可以提供更好的兼容性。
甚至可以通過使用JScript或VBScript中完成的簡單擴展功能腳本來「確信」支持EXSLT命名空間中的node-set
函數,但是這種方法可能會導致性能損失,因爲XSLT處理器必須加載腳本引擎。
您沒有提供任何有關爲什麼您認爲node-set()函數與您的性能問題有關的信息。實際上,您沒有向我們提供有關您的轉換的性質,所做的性能測量或您正在使用的技術的信息。你告訴我們的是,你已經搜索了可能的性能問題原因,並且你正在探索其中的一個。
你需要更加系統化。首先測量性能(時間和內存)如何隨着數據大小的增加而變化;圖表會告訴我們很多。使用Saxon的-TP等分析工具來查看時間正在進行的時間。簡單地測試不同處理器的性能如何變化可能是有益的。基本上,在開始提出理論之前,你需要數據。
您使用的是XSLT 1.0還是2.0?因爲在2.0中,不再需要使用節點集。 –
.NET不支持XPath/XSLT 2.0。,我正在使用XSLT 1.0 – Yuriy
Ahh doh!...是否有可能考慮使用第三方開源實現,例如http://saxon.sourceforge.net /? –