在Umbraco XSLT中使用自定义类文件

时间:2010-07-14 20:38:34

标签: c# xslt umbraco

我正在尝试在XSLT代码中引用自定义类文件。我将它作为DLL文件部署到/ Bin目录。

继续收到此错误:

  

System.Xml.Xsl.XslTransformException:找不到实现前缀'urn:sso'的脚本或外部对象。

CS文件声明:

namespace SSOUtilities
{
      public class sso

XSLT参考:

<xsl:stylesheet 
version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:sso="urn:sso"
xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" xmlns:umbraco.contour="urn:umbraco.contour" 
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets umbraco.contour sso">

config / xsltExtensions.config声明:

<ext assembly="/bin/SSOUtilities" type="SSOUtilities.sso" alias="sso" />

4 个答案:

答案 0 :(得分:4)

在Umbraco 4.5中,您不再需要将/ bin /放在config / xsltExtensions.config声明中,因此如果您使用Umbraco 4.5,这可能会导致您的错误。

http://our.umbraco.org/wiki/about/roadmap/umbraco-45/upgrading-to-umbraco-45

答案 1 :(得分:3)

让我添加另一个答案,其中包含一个扩展的完整示例。 Embed.cs类:

using System.Web;
using umbraco.BusinessLogic;

namespace Omega.XsltExtensions
{
    public class Embed
    {
        public static void LogEmbed(int nodeId)
        {
            Log.Add(LogTypes.Open, new User(0), nodeId, "Embedded pano, referer: " + HttpContext.Current.Request.UrlReferrer);
        }
    }
}

这是作为Omega.XsltExtensions.dll构建的,并复制到Umbraco的/ bin目录。

在我的xsltExtensions.config中,我添加了:

<ext assembly="/bin/Omega.XsltExtensions" type="Omega.XsltExtensions.Embed" alias="Ext.Embed" />

使用此扩展的空XSLT文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
  <!ENTITY nbsp "&#x00A0;">
]>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" 
xmlns:Ext.Embed="urn:Ext.Embed"
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets Ext.Embed ">

  <xsl:output method="xml" omit-xml-declaration="yes"/>

  <xsl:param name="currentPage"/>

  <xsl:template match="/">
      <xsl:value-of select="Ext.Embed:LogEmbed($currentPage/@id)"/>
  </xsl:template>

</xsl:stylesheet>

希望您在将其与此版本进行比较时,可以发现您的版本中的任何遗漏。

答案 2 :(得分:1)

你应该在你的exclude-result-prefixes中添加“sso”,这应该可以使它工作。

此外,您的类应继承自ApplicationBase,我不确定静态类是否有效:

public class sso : ApplicationBase

如果我没弄错的话,那就是使用umbraco.BusinessLogic。

答案 3 :(得分:1)

它最终成为xsltExtensions.config

中的语法问题
  <ext assembly="/bin/Umbraco.Forms.Core" type="Umbraco.Forms.Library" alias="umbraco.contour">
  <ext assembly="/bin/SSOUtilities" type="SSOUtilities.sso" alias="sso" />
  </ext>

注意安装Contour的结束标记放在文件中。