2

在处理复合页面模板项目时,我发现了非常有趣的问题。客户在其自定义开发的应用程序中使用${stringvalue-session-or-something-specific},这些应用程序使用 XSLT 在组件模板中保存和呈现。当尝试渲染包含保留的 Tridion dreamweaver 标识符 (${}) 的组件演示文稿时,我遇到了类似于以下内容的模板生成器错误

JScriptException: Expression '""["scopedTarget.personalia"]."" != ""' 在 Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String statement) 在 Tridion.ContentManager.Templating 有错误 'Expected identifier'。 Expression.JScriptEvaluator.EvaluateToString(String 语句)

删除和替换此标识符不是客户可接受的解决方案。我想知道解决这个问题的最佳解决方案是什么?要么使用 C# 代码呈现组件演示文稿,要么创建一些自定义重写(如果可能的话,因为我从组件演示文稿中得到错误)。

4

5 回答 5

4

如果客户在他们的应用程序中使用 JSP EL,也会发生类似的事情,这些应用程序使用相同的${...}语法,并希望将其封装在他们的模板中。

最常见的解决方案是用 Dreamweaver 模板中的类似语法替换此语法,并在 Dreamweaver 模板之后$[...]使用 .Net TBB ,该模板使用字符串替换或正则表达式对其进行转换。

有关执行此操作的示例 TBB,请参阅我的要点。

于 2013-01-22T09:13:32.007 回答
2

我通常使用此代码“在模板中启用 JSTL”。由于您无法更改 Tridion 以使用不同的代码标识符,因此您需要更改您的标记。在模板的末尾运行此 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);
        }
    }
}
于 2013-01-22T13:20:37.847 回答
1

如果您绝对无法更改 Dreamweaver 模板中的语法(正如我所说,我不确定我是否完全理解/同意这样做的原因),那么也许您可以改用Razor Mediator进行模板?

于 2013-01-22T12:42:40.720 回答
0

正如我提到的,替换语法不是解决方案。我已经通过在 Dreamweaver 模板之前在单独的 C# tbb 中呈现组件表示来解决这个问题。当然,如果允许您更改语法,David 的建议很有用。

于 2013-01-22T11:21:00.553 回答
0

我使用 SDL Tridion 2011 SP1 HR1。TemplateBuilder 版本 6.1 Build 6.1.0.73。从以下 DWT 代码之前执行的 Page 中提取组件。

<!-- TemplateBeginRepeat name="Components" --> 

@@RenderComponentPresentation()@@

<!-- TemplateEndRepeat -->

如果组件表示包含 ${sometext},则从模板生成器记录输出错误。

JScriptException: Expression '""["scopedTarget.personalia"]."" != ""' 在 Tridion.ContentManager.Templating.Expression.JScriptEvaluator.EvaluateToObject(String statement) 在 Tridion.ContentManager.Templating 有错误 'Expected identifier'。 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) 在 Tridion .ContentManager.Templating.Dreamweaver.DreamweaverMediator.TransformRegions(Package package, String dreamweaverTemplate) 在 Tridion.ContentManager.Templating.Dreamweaver.DreamweaverMediator。在 Tridion.ContentManager.Templating.Engine.ExecuteTemplate(模板模板,包包)在 Tridion.ContentManager.Templating.Engine.InvokeTemplate(包包,模板调用模板调用,模板模板)在 Tridion 的变换(引擎引擎,模板 templateToTransform,包包) .ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(Engine engine, Template templateToTransform, Package package) at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template template, Package package) at Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package package , TemplateInvocation templateInvocation, Template template) 在 Tridion.ContentManager.Templating.Engine.TransformPackage(Template template, Package package) 在 Tridion.ContentManager.Templating.Debugging。Tridion.ContentManager.Templating.Debugging.DebugSession.Run() 处的 DebuggingEngine.Run() --- 原因:预期标识符 eval 代码:第 1 行 - 错误:预期标识符

于 2013-01-23T07:44:53.130 回答