3

モジュラーテンプレートを使用して、Tridionコンポーネントのコンテンツ(特定のスキーマに基づく、つまり非任意)をXMLにダンプする最も簡単な方法は何ですか?

具体的には、コンポーネントのコンテンツをASP.Netカスタムコントロールとの間で渡す必要があります。つまり、次のようになります。

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

考えられる1つの方法は、デフォルトのDreamweaverコンポーネントデザインDWT TBBを微調整することだと思いますが、それは面倒すぎるようです。

編集

もう1つの曖昧なテーマは、上記の質問の2番目の部分でした。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#テンプレートビルディングブロックを作成します。

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メディエーターを使用してから、を使用してXSLTTBBを作成します。<xsl:copy-of select="."/>

XSLT Mediatorがインストールされていない場合は.Content、コンポーネントのプロパティをOutputという名前のパッケージに出力するC#TBBを作成する方が簡単です。詳細については、Nunoのコードサンプルを参照してください。

于 2012-12-03T12:33:00.527 に答える