3

使用模块化模板将 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 转义规则。)

4

2 回答 2

5

使用以下代码创建 ac# Template Building Block:

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;

等等等等。

于 2012-12-03T13:37:51.493 回答
3

我会使用 XSLT 中介,然后使用 XSLT TBB<xsl:copy-of select="."/>

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

于 2012-12-03T12:33:00.527 回答