将 tridion 组件转储为 XML



使用模块化模板将 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;

等等等等。

我会使用 XSLT

调解器,然后使用 <xsl:copy-of select="."/> 创建一个 XSLT TBB

如果未安装 XSLT 中介器,则编写一个 C# TBB 会更简单,该 TBB 将组件的 .Content 属性输出到名为 Output 的包中。有关更多详细信息,请参阅 Nuno 的代码示例。

相关内容

  • 没有找到相关文章

最新更新