跳至内容

Umbraco/示例和文章/XSLT/扩展 Xsl

来自维基教科书,开放世界的开放书籍

使用 Javascript、VB 或 C# 扩展 XSL

[编辑 | 编辑源代码]

最初来自http://www.umbraco.org/frontpage/documentation/articles/sampleofthemonth.aspx

在使用 xsl 开发时,该语言有时会显得不足,或者难以实现其他编程语言轻松完成的任务,而且耗时。

在 umbraco 邮件列表中回答一个问题时,发现使用您最喜欢的编程语言的内联代码扩展 xsl 并不是常识,但实际上非常容易做到。

使用内联服务器解释的 Javascript 的示例。

<?xml version="1.0" encoding="UTF-8"?>
	<xsl:stylesheet 
		version="1.0"    
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   		xmlns:msxml="urn:schemas-microsoft-com:xslt"    
		xmlns:msxsl="urn:schemas-microsoft-com:xslt"    
		xmlns:math="http://exslt.org/math"    
		xmlns:umbraco.library="urn:umbraco.library"    
		exclude-result-prefixes="msxml math umbraco.library"> 
		
		<xsl:output method="html"/> 
			<xsl:param 
				name="currentPage"/> 
				
				<msxsl:script 
					language="JavaScript" 
					implements-prefix="math"> 
						<![CDATA[ 
						function random(){ 
							return Math.random();
						} 
						]]> 
				</msxsl:script> 
				<xsl:template match="/">
					<xsl:variable 
						name="nodeset" 
						select="$currentPage/node"/> 
						
						<xsl:value-of 
							select="$nodeset[floor(math:random() * (last() -1)) + 1]"/> 
				</xsl:template> 
	</xsl:stylesheet> 

以上示例展示了如何从节点集中获取随机节点,使用包装器来包装 Javascript 中的 "Math.random()" 函数,以生成随机种子。

Javascript 在服务器端执行 - 实际上任何定义的函数都会被编译为 MSIL(包装在类定义中),因此对总体性能的影响很小 - 其他场景可能会导致性能开销,但是 - 在即将发布的 Umbraco v. 2.1 中 - 可以缓存宏的输出,因此应该可以保持高性能,同时在开发中保持灵活性。

您可以使用不同的编程语言,可以在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconXSLTStylesheetScriptingUsingMsxslscript.asp找到完整的列表和更多信息。

作者:Kasper Bumbech Andersen

华夏公益教科书