2012-12-03 40 views
3

使用模塊化模板將Tridion組件內容(基於給定模式,即:非任意模式)轉儲到XML中,最簡單的方法是什麼?將Tridion組件轉換爲XML

具體而言,需要組件內容傳遞給/如ASP.Net自定義控件,就是這樣的:

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

我看到一個可能的辦法是調整默認Dreamweaver的組件設計 DWT TBB ,但這似乎太費力。

EDIT

另一個陰暗主題是上述問題的第二部分:嵌入XML到ASP.Net控制標記。問題是XML需要被轉義。下面的謎題做它在DWT(pressuming,即努諾的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> 

(所有這一切ADO是唯一需要克服DWT的神祕JS轉義規則。)

回答

5

創建一個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; 

等及等等。

3

我會使用XSLT調解員,然後使用<xsl:copy-of select="."/>

做出XSLT TBB如果你沒有安裝XSLT調解員做,這將是簡單的組件的.Content財產寫入與輸出C#TBB的包的名稱輸出。有關更多詳細信息,請參閱Nuno的代碼示例。

+1

第二個建議是最簡單的,因爲您不需要安裝任何XSLT中介。 – Quirijn