簡體   English   中英

什么是更好的msxsl:node-set()或exsl:node-set()函數?

[英]What is better msxsl:node-set() or exsl:node-set() function?

在XSLT轉換過程中,我遇到了很大的性能和內存使用問題。 我已經瀏覽了幾頁如何優化XSLT,其中一種方法是減少node-set()函數的使用。

我發現在msxslexsl中有兩個node-set函數。 這些功能在性能和內存使用方面是否不同?

純XSLT 1.0不提供將結果樹片段轉換為節點集的方法,因此XSLT 1.0處理器必須為該任務提供擴展功能。 各種版本的Microsoft MSXML處理器在命名空間urn:schemas-microsoft-com:xslt提供了一個本地名稱node-set urn:schemas-microsoft-com:xslt ,文檔和許多示例將該命名空間綁定到前綴msxsl以便用法示例然后調用msxsl:node-set($rtf-var) 您可以使用任何其他前綴,但重要的是命名空間和MSXML僅適用於命名空間urn:schemas-microsoft-com:xslt

據我所知,在.NET框架中, XslTransform類(現已過時)也只支持Microsoft命名空間`urn:schemas-microsoft-com:xslt的擴展函數node-set

但是,由於EXSLT iniative在名稱空間http://exslt.org/common標准化了一個名為node-set的擴展函數,許多XSLT處理器現在提供對EXSLT擴展函數的支持,該函數通常稱為exsl:node-set但是又是什么問題是命名空間而不是前綴。 .NET框架中的Microsoft XslCompiledTransform支持node-set函數的擴展函數名稱空間,因此您可以選擇。 功能沒有區別,我不知道任何性能差異,我不認為有一個,因為我無法想象為什么一個不同的名稱應該導致一個不同的,更復雜的實現。

我寧願考慮你的樣式表需要哪種兼容性,如果你想用.NET和MSXML(例如在Internet Explorer中)運行它,那么選擇命名空間urn:schemas-microsoft-com:xslt ,如果你想使用.NET運行它,也許在其他平台上使用XSLT處理器,然后EXSLT命名空間為您提供更好的兼容性。

甚至MSXML也可以“說服”通過使用在JScript或VBScript中完成的簡單擴展函數腳本來支持EXSLT命名空間中的node-set函數,但是這種方法可能會導致性能下降,因為XSLT處理器必須加載腳本引擎。

您沒有提供有關為什么您認為node-set()函數與性能問題有關的信息。 實際上,您沒有向我們提供有關轉換性質,您所進行的性能測量或您正在使用的技術的信息。 所有你告訴我們的是,你已經搜索了可能導致性能問題的原因,並且你正在探索其中一個。

你需要更加系統化。 首先測量性能(時間和內存)如何隨着數據量的增加而變化; 圖表會告訴我們很多。 使用Saxon的-TP等分析工具來查看時間的變化。 簡單地測試不同處理器的性能如何變化可能是有益的。 基本上,在開始提出理論之前,您需要數據。

我想知道你為什么要使用節點集... 取自這個12歲的帖子

“如果您還沒有猜到,XSLT 2.0已經顯示了RTF。現在當您使用xsl:variable創建臨時樹時,該變量的值是一個真正的節點集。實際上,在XPath 2.0術語中,它是一個真正的節點序列,由一個文檔節點組成,它是XPath 2.0的名稱,用於XPath 1.0稱為“根節點”。然后,您可以使用路徑表達式在樹中向下鑽取,將模板應用於它,等等,就像你使用任何其他源文檔一樣。使用XSLT 2.0,不再需要node-set()擴展函數。“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM