Tridion 处理RTF字段的特殊字符

Tridion 处理RTF字段的特殊字符,tridion,tridion-2011,Tridion,Tridion 2011,我们确实从Tridion 5.3升级到了Tridion 2011 SP1 在Tridion 5.3中,我们使用VBScript模板,作为此次升级的一部分,我们将现有VBScript模板转换为复合组件模板。关于RTF字段的内容,我们面临以下两个问题 问题1:在我们现有的RTF内容字段中,我们在许多位置有空标记/HTML标记。例如,当我们使用复合组件模板(Tridion 2011 SP1环境)发布内容时,上述锚定标记将转换为。这破坏了现有的javascript功能。为了克服这个问题,我们编写了C函数

我们确实从Tridion 5.3升级到了Tridion 2011 SP1

在Tridion 5.3中,我们使用VBScript模板,作为此次升级的一部分,我们将现有VBScript模板转换为复合组件模板。关于RTF字段的内容,我们面临以下两个问题

问题1:在我们现有的RTF内容字段中,我们在许多位置有空标记/HTML标记。例如,
当我们使用复合组件模板(Tridion 2011 SP1环境)发布内容时,上述锚定标记将转换为
。这破坏了现有的javascript功能。为了克服这个问题,我们编写了C函数,它可以查找空标记,并用
替换内部文本,比如
,然后一切正常。但在CT级别为每个RTF字段调用此函数是一项重大活动,因为我们有数字组件Tempate。有没有更好的办法

问题2:在同一RTF字段中,我们有类似
和#160(可能是编辑器从web或其他地方复制粘贴了它),所以当我们尝试发布页面或组件时,它会因错误而失败。
JScript异常:表达式值未终止的字符串常量


是否存在有助于解决问题的默认TBB?

问题1:

您还可以使用过滤XSLT在组件保存时修改RTF内容

通过这种方式,您可以在组件保存时将任何空标记
替换为
,而不需要对模板进行任何进一步的更改

第二期:

 看起来像一个编码的
,请参阅字符代码:


也许你可以用适当的HTML代码来替换这个字符代码,使用一个过滤XSLT或者一个C*TBB< < /P> < P>,因为你已经有了一个将内联的关闭锚标签转换成锚标签的功能,在它们中有一个非破坏的空间,你可以考虑从页面模板中使用这个函数。而不是在每个组件模板中使用它;这将需要更少的模板来更改

您可能还需要考虑用正确关闭的锚标签替换内联的闭合锚标签,而不必实际插入额外的空间。 下面是一个C#片段,您可以在TBB中使用它来替换内联闭合锚定标记:

Item outputItem = package.GetByName(pcakge.OutputName);
package.Remove(outputItem);
string outputString = Regex.Replace(outputItem.GetAsString(), "(<a[^>]*?)/>", "$1></a>", RegexOptions.Singleline);
outputItem.SetAsString(outputString);
package.PushItem(Package.OutputName, outputItem);
Item outputItem=package.GetByName(pcakge.OutputName);
包装。移除(输出项);
字符串outputString=Regex.Replace(outputItem.GetAsString(),“(]*?)/>”,“$1>”,RegexOptions.Singleline);
outputItem.SetAsString(outputString);
package.PushItem(package.OutputName,outputItem);

您可以将其扩展为替换 ;但这不应引起任何问题,如 ;是HTML中的有效转义序列(Tridion RTF字段本质上是XML,这可能导致出现 ;而不是…。

如果不调用清理模板(默认完成操作的一部分),则应修复第一个问题删除清理模板后,问题仍然存在。请参阅中有关自动关闭锚的其他选项。奇怪的是,您会在 ;因为它是一个有效的数字实体。无论如何,您可以尝试用相同的XSLT替换它,如下所示: