使用模块化模板将 Tridion 组件内容(基于给定的模式,即:非任意)转储到 XML 中的最简单方法是什么?
具体来说,需要将组件的内容传递给/作为自定义控件 ASP.Net,即类似以下内容:
<custom:MyControl runat="server"
TextField="value1"..>
<EmbeddedField>
..
</EmbeddedField>
</custom:MyControl>
我认为一种可能的方法是调整默认 Dreamweaver 组件设计 DWT TBB,但这似乎太费力了。
编辑
另一个模糊的主题是上面问题的第二部分:将XML嵌入到控件标记 ASP.Net。问题是 XML 需要转义。下面的脑筋急转弯在DWT(加压,Nuno的TBB写入输出)中做到这一点:
<custom:MyControl runat="server">
<xml>
@@(Output).replace(RegExp.call(null, /&/.toString()[1], "g"), '&').replace(RegExp.call(null, /</.toString()[1], "g"), '<').replace(RegExp.call(null, />/.toString()[1], "g"), '>').replace(RegExp.call(null, String.fromCharCode(34), "g"), '"')@@
</xml>
</custom:MyControl>
(所有这些工作只是为了克服DWT晦涩难懂的JS转义规则。
使用以下代码创建 C# 模板构建基块:
TemplatingLogger log = TemplatingLogger.GetLogger(GetType());
if (package.GetByName(Package.ComponentName) == null)
{
log.Debug("Not running in a Component Template, exiting.");
return;
}
Component component = (Component)engine.GetObject(package.GetByName(Package.ComponentName));
package.PushItem(Package.OutputName, package.CreateStringItem(ContentType.Xml, component.Content.OuterXml));
并在您的模板中使用它,而无需任何其他构建块。
这将输出Component.Content
的确切内容,这很少是你真正想要的(例如,你如何处理二进制文件或链接组件?),所以你会想要发展到其他的东西,提供更多细节,并可能从XML节点中删除命名空间......
我通常使用较大的switch(field.GetType().Name)
,然后根据需要处理每种字段类型,大致如下:
foreach (ItemField field in content)
{
string fieldType = field.GetType().Name;
switch (fieldType)
{
case "XhtmlField":
// do something, like write it to an XmlWriter
break;
等等等等。
调解器,然后使用 <xsl:copy-of select="."/>
创建一个 XSLT TBB
如果未安装 XSLT 中介器,则编写一个 C# TBB 会更简单,该 TBB 将组件的 .Content
属性输出到名为 Output 的包中。有关更多详细信息,请参阅 Nuno 的代码示例。