2012-11-02 130 views
1

我们确实从Tridion 5.3升级到Tridion 2011 SP1。处理RTF字段的特殊字符

在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>,那么事情工作正常。但是在CT级别为每个RTF字段调用这个函数是一个很大的活动,因为我们有组件Tempate。有没有更好的方法来做到这一点。

问题2:在同一个RTF字段中,我们有像&#160;这样的内容(可能是编辑已将副本粘贴到网页或某处),所以当我们尝试发布页面或组件时,它会因错误而失败。 JScriptException:表达式valueUnterminated字符串常量。

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

+1

如果您不打电话清理模板(缺省完成操作的一部分) –

+1

应解决第一个问题清除后清理模板问题仍然存在。 – user1453602

+0

请参阅[本问题]中自闭合锚点的其他选项(http://stackoverflow.com/questions/10537656/creating-anchor-links-in-rich-text-fields-with-sdl-tridion-2011- SP1)。 –

回答

1

问题1:

你也可以使用一个过滤XSLT来修改组件节省您的RTF内容。

通过这种方式,您可以在组件保存中将任何空标记<tag></tag>替换为<tag>&nbsp;</tag>,并且不需要对模板进行任何更改。

问题2:

&#160;似乎是一个编码&nbsp;,见字符代码:http://www.escapecodes.info/

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

+0

这是有点奇怪,你应该得到一个错误 ,因为它是一个有效的数字实体。无论如何,您可以尝试使用与以下相同的XSLT替换它: Quirijn

0

由于您已经有了将内联闭合锚点标记转换为锚点标记的功能,因此您可以考虑在页面模板中使用此功能而不是使用此功能在每个组件模板中;这将需要更少数量的模板来更改...

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

以下是你可以在一个TBB用来替换内嵌封闭锚标记一个C#片段:

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); 

你可以扩展它同时更换&#160;与& nbsp;但这不应该引起任何问题,如&#160;是HTML中的有效转义序列(Tridion RTF字段本质上是XML,可能是导致原因的原因;出现而非& nbsp; ...)。