在处理复合页面模板项目时,我发现了非常有趣的问题。客户在其自定义开发的应用程序中使用 $ {stringvalue-session-or-something-specific} ,这些应用程序使用XSLT在组件模板中保存和呈现。当尝试渲染包含保留的Tridion Dreamweaver标识符($ {})的组件演示文稿时,我遇到类似于
的模板生成器错误JScriptException:Expression'“”[“scopedTarget.personalia”]。“”!=“”'有错误'预期标识符' 在Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String statement) 在Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToString(String statement)
删除和替换此标识符不是客户可接受的解决方案。 我想知道什么是应对这个问题的最佳解决方案?使用C#代码渲染组件演示文稿,可能会创建一些自定义重写(如果可能,因为我从组件演示中得到错误)。
答案 0 :(得分:4)
如果客户在其应用程序中使用JSP EL,并使用相同的${...}
语法,并希望将其封装在模板中,则会发生类似情况。
最常见的解决方案是使用Dreamweaver模板中的$[...]
替换此语法,并在使用字符串替换或正则表达式转换的Dreamweaver模板之后使用.Net TBB 它
请参阅我的gist以获取执行此操作的TBB示例。
答案 1 :(得分:2)
我通常使用此代码“在模板中启用JSTL”。由于您无法将Tridion更改为使用其他代码标识符,因此需要更改标记。在模板的END处运行此TBB,将$[expression]
转换为${expression}
using System;
using System.Text.RegularExpressions;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Templating.Assembly;
namespace TridionTemplates
{
[TcmTemplateTitle("Enable JSTL")]
public class EnableJSTL : ITemplate
{
private static readonly Regex JstlRegex = new Regex(@"\$\[.*\]");
public void Transform(Engine engine, Package package)
{
Item outputItem = package.GetByName(Package.OutputName);
string outputText = outputItem.GetAsString();
Match match = JstlRegex.Match(outputText);
while (match.Success)
{
String replaceJstl = match.Value.Replace("[", "{");
replaceJstl = replaceJstl.Replace("]", "}");
outputText = outputText.Replace(match.Value, replaceJstl);
match = match.NextMatch();
}
outputItem.SetAsString(outputText);
package.Remove(outputItem);
package.PushItem(Package.OutputName, outputItem);
}
}
}
答案 2 :(得分:1)
如果您绝对无法更改Dreamweaver模板中的语法(正如我所说,我不确定我是否完全理解/同意其原因)那么您可以转而使用Razor Mediator你的模板反而是吗?
答案 3 :(得分:0)
正如我所说,替换语法不是解决方案。我已经通过在Dreamweaver模板之前在单独的C#tbb中呈现组件表示来解决这个问题。当然,如果允许您更改语法,David建议很有用。
答案 4 :(得分:0)
我使用SDL Tridion 2011 SP1 HR1。 TemplateBuilder版本6.1 Build 6.1.0.73。 从下面的DWT代码之前执行的页面中提取组件。
<!-- TemplateBeginRepeat name="Components" -->
@@ RenderComponentPresentation()@@
<!-- TemplateEndRepeat -->
如果组件演示文稿包含$ {sometext},则从“模板”构建器记录输出错误。
JScriptException:Expression'“”[“scopedTarget.personalia”]。“”!=“”'有错误'预期标识符' 在Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String statement) 在Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToString(String statement) at Tridion.ContentManager.Templating.Package.EvaluateExpression(String expression) at Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.TransformValueReferences(Package package,StringReference templateReference,Regex startTagExpression,String endTag) at Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.TransformRegions(Package package,String dreamweaverTemplate) 在Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator.Transform(引擎引擎,模板templateToTransform,包包) 在Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包裹包) 在Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,TemplateInvocation templateInvocation,模板模板) 在Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(引擎引擎,模板templateToTransform,包包) 在Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包裹包) 在Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,TemplateInvocation templateInvocation,模板模板) 在Tridion.ContentManager.Templating.Engine.TransformPackage(模板模板,包裹包) 在Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run() 在Tridion.ContentManager.Templating.Debugging.DebugSession.Run() ---引起: 预期的标识符 eval代码:第1行 - 错误:预期标识符