处理RTF字段的特殊字符

时间:2012-11-02 08:14:39

标签: tridion tridion-2011

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

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

问题1:在我们现有的RTF字段内容中,我们在多个位置都有空标签/ HTML标签。例如。<a name="Contact" id="Contact"></a>当我们使用复合组件模板(Tridion 2011 SP1环境)发布内容时,上面提到的锚标记将转换为<a name="Contact" id="Contact" />。这打破了现有的JavaScript功能。为了克服这个问题,我们编写了C#函数,它们找到了空标记并用&nbsp;替换内部文本,如<a name="Contact" id="Contact">&nbsp;</a>,然后事情正常。但是为每个RTF字段在CT级别调用此函数是一项很大的活动,因为我们有编号组件Tempate。有没有更好的方法呢。

问题2:在同一个RTF字段中,我们有像&#160;这样的内容(编辑可能会从网络或某处复制粘贴),因此当我们尝试发布页面或组件时,它会因错误而失败。 JScriptException:Expression valueUnterminated String Constant。

是否有任何默认TBB有助于解决问题?

2 个答案:

答案 0 :(得分:2)

问题1:

您还可以使用过滤XSLT 来修改组件保存中的RTF内容。

这样,您可以在组件保存中用<tag></tag>替换任何空标记<tag>&nbsp;</tag>,并且不需要对模板进行任何进一步更改。

问题2:

&#160;似乎是经过编码的&nbsp;,请参见字符代码:http://www.escapecodes.info/

也许您可以使用正确的html编码替换此字符代码,使用过滤xslt或C#TBB

答案 1 :(得分:0)

由于您已经有一个将内联闭合锚标记转换为锚定标记并且其中包含不间断空格的函数,您可以考虑在页面模板中使用此函数,而不是在每个组件模板中使用它;这将需要更少数量的模板来改变......

您也可以考虑使用正确关闭的锚标记替换内联闭合锚标记,而不实际插入额外的空格。

下面是一个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);

您可以将其扩展为也替换&amp;#160;与&amp; nbsp;但这不应该引起任何问题,因为&amp;#160;是HTML中的有效转义序列(Tridion RTF字段本质上是XML,可能是&amp;#160的原因;而不是&amp; nbsp; ......)。