我正在从事一个包含许多 XSLT 转换的项目。 转换必须尽可能快。
为了便于阅读,我编写了许多内容,将“业务逻辑”和 “输出”。例如
<!-- Business Logic -->
<xsl:variable name="myLocalVar">
<xsl:value-of select="func:whateverComputation(params)" />
</xsl:variable>
<!-- more buss logic here -->
<!-- Output -->
<xsl:element name="mytag">
<xsl:value-of select="$myLocalVar" />
</xsl:element>
当然这可以写成紧凑的形式
<xsl:element name="mytag">
<xsl:value-of select="func:whateverComputation(params)" />
</xsl:element>
第一种形式比第二种形式慢吗?
最佳答案
摘自 the XSLT FAQ 的一部分:
与 XSLT 性能相关的几点:
xsl:variables
是动态值。这些变量不在缓存中,并且每次在 XSL 中引用它们时都会运行。xsl:variable
的显式类型转换提高性能。您可以使用string()
进行类型转换和boolean()
功能。例如:
<xsl:variable name="_attr" select="string( /node/child[ @attr ] )">
尽可能使用属性,而不是使用子元素。使用属性而不是元素可以提高性能。执行 XPath 匹配时,属性速度更快,因为它们是松散类型的。这使得模式验证变得更加容易。
当您匹配属性值时,请使用枚举器属性。使用多个属性名称作为位,并将它们的值设置为 true 或 false。
有关如何有效使用 XSLT 的八个技巧:
保持源文档较小。如有必要,请先拆分文档。
在运行之间保持 XSLT 处理器(和 Java VM)加载在内存中
如果重复使用相同的样式表,请先编译它。
如果您重复使用相同的源文档,请将其保留在内存中。
如果您重复执行相同的转换,请不要这样做。而是存储结果。
保持输出文档较小。例如,如果您要生成 HTML,请使用 CSS。
切勿多次验证同一源文档。
将复杂的转换分为几个阶段。
有关如何编写高效 XSLT 的八个技巧:
避免重复使用“//item”。
不要多次评估同一节点集;将其保存在变量中。
避免
<xsl:number>
如果可以的话。例如,通过使用position()
.使用
<xsl:key>
,例如解决分组问题。避免模板规则中出现复杂的模式。相反,使用
<xsl:choose>
在规则之内。使用
preceding[-sibling]
时要小心或following[-sibling]
轴。这通常表明算法具有 n 平方性能。不要对同一节点集进行多次排序。如有必要,将其保存为结果树片段并使用
node-set()
访问它扩展功能。输出简单的
#PCDATA
的文本值元素,使用<xsl:value-of>
优先于<xsl:apply-templates>
.
关于performance - XSLT 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9398953/