我正在尝试在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" />
答案 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 " ">
]>
<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的结束标记放在文件中。