Дамп компонента Tridion в виде XML

Каков самый простой способ выгрузить содержимое компонента Tridion (на основе заданной схемы, то есть непроизвольного) в XML с использованием модульного шаблона?

В частности, необходимо передать содержимое компонента в/в качестве пользовательского элемента управления ASP.Net, то есть что-то вроде:

<custom:MyControl runat="server"
    TextField="value1"..>
  <EmbeddedField>
    ..
  </EmbeddedField>
</custom:MyControl>

Я вижу, что одним из возможных способов может быть настройка дизайна компонентов Dreamweaver по умолчанию DWT TBB, но это кажется слишком трудоемким.

ИЗМЕНИТЬ

Другой неясной темой была вторая часть вопроса выше: встраивание XML в разметку управления ASP.Net. Проблема в том, что XML нужно экранировать. Следующая головоломка делает это в DWT (при условии, что TBB Нуно записал в Output):

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


person esteewhy    schedule 03.12.2012    source источник


Ответы (2)


Создайте строительный блок шаблона 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;

И так далее.

person Nuno Linhares    schedule 03.12.2012

Я бы использовал XSLT-посредник, а затем сделал XSLT TBB, используя <xsl:copy-of select="."/>

Если у вас не установлен XSLT Mediator, будет проще написать C# TBB с выводом свойства .Content компонента в пакет с именем Output. Дополнительные сведения см. в примере кода Nuno.

person Chris Summers    schedule 03.12.2012
comment
Второе предложение является самым простым, так как вам не нужно устанавливать какой-либо посредник XSLT. - person Quirijn; 03.12.2012