我有一个XSLT用于在浏览器中查看XML文件。该XSLT编写得很 naive,目前执行时间很长(几分钟)。
我的XML文件大小适中(〜1 MiB),对于相同文档的其他执行不同处理的XSLT执行速度更快。因此我知道问题不在于XML的大小,而是在于我的XSLT。
我应该如何进行分析和优化我的XSLT?
(在浏览器中执行复杂的XSLT是否是一个坏主意?我应该在应用程序中应用XSLT吗?)
我有一个XSLT用于在浏览器中查看XML文件。该XSLT编写得很 naive,目前执行时间很长(几分钟)。
我的XML文件大小适中(〜1 MiB),对于相同文档的其他执行不同处理的XSLT执行速度更快。因此我知道问题不在于XML的大小,而是在于我的XSLT。
我应该如何进行分析和优化我的XSLT?
(在浏览器中执行复杂的XSLT是否是一个坏主意?我应该在应用程序中应用XSLT吗?)
"//item"
。
不要对同一个节点集计算多次。将其保存在变量中。
如果可以的话,避免使用。例如,使用position()。
使用,例如解决分组问题。
避免在模板规则中使用复杂的模式。相反,请使用
within the rule。
在使用preceding[-sibling]或following[-sibling]轴时要小心。这经常
表示一个具有n平方性能的算法。
不要对同一个节点集进行多次排序。如果必要,将其保存为结果树碎片,并使用node-set()扩展
函数访问它。
为了输出简单的#PCDATA元素的文本值,请使用
而不是。
(来自http://www.dpawson.co.uk/xsl/sect4/N9883.html#d15756e150)
遵循这些规则通常会导致非常高效的XSLT,您可能根本不需要使用分析器。
关于您在浏览器中使用XSLT的问题:我不建议这样做,因为首先您不是平台无关的(不是每个浏览器都可能支持它,或者某些浏览器可能仅支持性能较差的引擎),其次您不能控制所使用的引擎。
//item
"。<xsl:number>
。例如,通过使用position()
。<xsl:key>
,例如解决分组问题。<xsl:choose>
。preceding[-sibling]
或following[-sibling]
轴时要小心。这通常表示具有n
平方性能的算法。node-set()
扩展函数访问它。<xsl:value-of>
而不是<xsl:apply-templates>
。我喜欢在基于Windows的机器上使用Altova's XMLSpy。它还内置了一个分析器。你可以观看有关使用编辑器的视频(扫描至5:45以了解更多关于分析器的信息)。这是一款商业产品...带有试用期 :)