2009-01-12 62 views
25

我有一個XSLT用於查看瀏覽器中的XML文件。 XSLT是天真寫的,並且需要很長時間來執行(幾分鐘)。如何分析和優化XSLT?

我的XML文件大小適中(〜1 MiB),其他XSLT對於執行不同處理的同一文檔可以更快地執行。所以我知道這不是問題的XML大小,而是我的XSLT。

我該如何去分析和優化我的XSLT?

(這是個壞主意,在瀏覽器中做複雜的XSLT文件?我應該代替應用XSLT應用端?)

+0

如果您提供了觀察問題的XSLT代碼和XML文檔,我和其他人可以嘗試提供幫助。 – 2009-01-12 14:14:34

+0

注意:XSLT分析和(更好)調試已添加到Visual Studio 2010中。當然,這仍然是XSLT 1.0。 – Abel 2010-04-13 10:36:28

回答

26

您使用哪種XSLT引擎?如果您使用.NET引擎和Visual Studio,則可以使用集成到Visual Studio中的XSLT profiler這非常有用。

其他優秀的剖析工具是Altova的XML SpyOxygen

如果您發佈您的XSLT,可能會更容易告訴您哪裏可能存在瓶頸。一般來說,要小心XPath表達式,例如'//',在::之前和在::之後。一些更多的規則和最佳實踐:

  1. 避免重複使用的"//item"
  2. 不要多次評估相同的節點集;將它保存在一個變量中。
  3. 如果可以,請避免<xsl:number>。例如,通過使用position()。例如
  4. 使用<xsl:key>來解決分組問題。
  5. 避免模板規則中的複雜模式。相反,在規則中使用 。
  6. 使用preceding[-sibling]following[-sibling]軸時要小心。這通常是 表示具有n平方 性能的算法。
  7. 不要對多個節點集進行多次排序。如有必要,將 保存爲結果樹片段,並使用node-set()擴展名 函數訪問 。
  8. 要輸出簡單的#PCDATA元素的文本值,請使用 <xsl:value-of>而不是 <xsl:apply-templates>

(從http://www.dpawson.co.uk/xsl/sect4/N9883.html#d15756e150

遵循這些規則通常會導致非常有效的XSLT,你可能不需要在所有使用一個分析器。

關於你的問題有關在瀏覽器XSLT:我不會推薦它,因爲第一你是不是獨立於平臺(不是每一個瀏覽器可能支持或某些瀏覽器可能只用一個業績不佳的引擎支持它)和第二,你可以不能控制使用的發動機。

+0

我在瀏覽器中運行,所以我的XSLT引擎是Firefox,IE和Safari使用的。 我知道每個引擎的行爲都與XSLT不同,因此對一個特定引擎進行概要分析可能並不能反映出全部3. – pauldoo 2009-01-12 10:09:54

2

商業Oxygen XML編輯器爲分析和調試XSLT文件的功能。這也是一個很好的XML編輯器。

18

如果您提供的XSLT代碼,並在其上觀察問題的XML文檔時間的試用期,我和其他人可能試圖幫助

這裏有一些XSLT usage and performance tipsMichael Kay

對於如何有效使用XSLT

八個小竅門:

  1. 保留源文件小。如有必要,先分割文件。
  2. 保持XSLT處理器(和Java VM)在運行之間加載
  3. 如果您重複使用相同的樣式表,請先編譯它。
  4. 如果您重複使用相同的源文檔,請將其保存在內存中。
  5. 如果您重複執行相同的轉換,則不要。改爲存儲結果。
  6. 保持輸出文件的小。例如,如果您要生成HTML,請使用CSS。
  7. 永遠不要多次驗證相同的源文檔。
  8. 將複雜的轉換分解爲幾個階段。

八個小竅門如何寫出高效的X SLT:

  1. 避免重複使用的 「//item」。
  2. 不要多次評估相同的節點集;將它保存在一個變量中。
  3. 如果可以,請避免<xsl:number>。例如,通過使用position()。例如
  4. 使用<xsl:key>來解決分組問題。
  5. 避免模板規則中的複雜模式。相反,在規則中使用<xsl:choose>
  6. 使用preceding[-sibling]following[-sibling] 軸時要小心。這通常是 表示具有性能的算法。
  7. 不要對多個節點集進行多次排序。如有必要,請將其保存爲 結果樹片段 ,並使用node-set()擴展函數對其進行訪問。
  8. 要輸出簡單#PCDATA元素的文本值,請使用<xsl:value-of> 優先 至<xsl:apply-templates>