2012-12-03 3 views
3

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

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

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

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

РЕДАКТИРОВАТЬ

Другим предметом была мутной вторая часть выше вопрос: вложения XML в разметку управления ASP.Net. Проблема в том, что XML необходимо экранировать. Следующая загадка делает это DWT (pressuming, что Т Нуно писали в 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> 

(Все, что лукаво нужно только преодолеть тайные JS спасаясь правилами DWT в.)

ответ

5

Создание C# 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; 

и так далее, и так далее.

3

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

Если у вас не установлен посредник XSLT, будет проще писать на с # TBB с выходами на .Content свойство компонента в пакете с именем Output. Дополнительную информацию см. В примере кода Nuno.

+1

Второе предложение является самым простым, поскольку вам не нужно будет устанавливать какой-либо XSLT-посредник. – Quirijn