2013-03-06 16 views
5

関連するコンテンツを含むSDL Tridionページの情報をxml形式で抽出することは可能ですか?私はこれと似たよう期待していSDL Tridion:XML形式のページの論理構造

<page name="mypagename"> 
    <page id="xxxxx"/> 
    <template name="abc" id="123"> 
     <container name="xyz"> 
      <content name="asd" id="123"> 
      <Path="" \> 
      </content> 
     </container> 
    </template> 
    </page> 

技術スタックは、Tridionの2011年およびJavaです。

私はTridionの初心者ですので、少し詳細な答えが大いに役立ちます。

+0

使用しているSDL Tridionのバージョンと、使用するテクノロジ/言語を追加してください。 –

答えて

6

あなたが実際に必要なものによっては、そこにこれを行うのMUCHシンプルな方法がありますが、私はC#で書かれた以下のTBBクラスを使用

class GetPageXML : TemplateBase 
    { 
     public override void Transform(Engine engine, Package package) 
     { 
      Initialize(engine, package); 
      Logger.Debug("This will get the full page XML"); 
      Item pageItem = m_Package.GetByType(ContentType.Page); 

      Page currentPage = GetPage(); 

      m_Engine.PublishingContext.RenderContext.ContextVariables.Add("CURRENT_PAGE", currentPage); 


      XmlDocument pageXml = pageItem.GetAsXmlDocument(); 
      foreach (XmlNode cpNode in pageXml.SelectNodes("/tcm:Page/tcm:Data/tcm:ComponentPresentations/tcm:ComponentPresentation", NSManager)) 
      { 
       TcmUri componentURI = new TcmUri(cpNode.SelectSingleNode("tcm:Component/@xlink:href", NSManager).Value); 
       TcmUri componentTemplateURI = new TcmUri(cpNode.SelectSingleNode("tcm:ComponentTemplate/@xlink:href", NSManager).Value); 

       //Render the componentPresentation 
       XmlNode cpRenderElement = pageXml.CreateElement("tcm", "RenderedComponentPresentation", "http://www.tridion.com/ContentManager/5.0"); 
       XmlAttribute attNamespace = pageXml.CreateAttribute("xmlns:tcdl"); 
       attNamespace.Value = "http://www.tridion.com/ContentDelivery/5.3/TCDL"; 
       cpRenderElement.Attributes.Append(attNamespace); 


       if (m_Engine.PublishingContext.RenderContext.ContextVariables.Contains("ORDINAL_POSITION")) 
       { 
        int ordinalPosition = ((int)m_Engine.PublishingContext.RenderContext.ContextVariables["ORDINAL_POSITION"]) + 1; 
        m_Engine.PublishingContext.RenderContext.ContextVariables["ORDINAL_POSITION"] = ordinalPosition; 
       // m_Engine.PublishingContext.RenderContext.ContextVariables["ORDINAL_POSITION"] = 0; 
       } 
       else 
       { 
        m_Engine.PublishingContext.RenderContext.ContextVariables.Add("ORDINAL_POSITION", 0); 
       } 


       //Get the metadata from the CT 
       ComponentTemplate componentTemplate = (ComponentTemplate)m_Engine.GetObject(componentTemplateURI); 
       String metadataXmlString = ""; 
       String cpRegionName = ""; 
       if (componentTemplate.Metadata != null) 
       { 
        metadataXmlString = componentTemplate.Metadata.OuterXml; 
        XmlNode cpRegionNode = componentTemplate.Metadata.SelectSingleNode("//*[local-name()='region']"); 
        if (cpRegionNode != null) 
        { 
         cpRegionName = "_" + cpRegionNode.InnerText; 
        } 
       } 
       cpNode.SelectSingleNode("tcm:ComponentTemplate", NSManager).InnerXml = metadataXmlString; 



       String REGIONAL_POSITION = "REGIONAL_POSITION" + cpRegionName; 
       if (m_Engine.PublishingContext.RenderContext.ContextVariables.Contains(REGIONAL_POSITION)) 
       { 
        int regionalPosition = ((int)m_Engine.PublishingContext.RenderContext.ContextVariables[REGIONAL_POSITION]) + 1; 
        m_Engine.PublishingContext.RenderContext.ContextVariables[REGIONAL_POSITION] = regionalPosition; 
        // m_Engine.PublishingContext.RenderContext.ContextVariables["ORDINAL_POSITION"] = 0; 
       } 
       else 
       { 
        m_Engine.PublishingContext.RenderContext.ContextVariables.Add(REGIONAL_POSITION, 0); 
       } 



       DateTime cpRenderStart = DateTime.Now; 
       string contentCP = m_Engine.RenderComponentPresentation(componentURI, componentTemplateURI); 

       DateTime cpRenderEnd = DateTime.Now; 
       TimeSpan cpRenderTime = cpRenderEnd.Subtract(cpRenderStart); 

       XmlAttribute attCPRenderTime = pageXml.CreateAttribute("RenderTime"); 
       attCPRenderTime.Value = String.Format("{0:0000}", cpRenderTime.TotalMilliseconds) + " milliseconds"; 
       cpNode.Attributes.Append(attCPRenderTime); 


       if (m_Engine.RenderMode != RenderMode.Publish) 
       { 
        //Remove the '&' symbols created for linking in previewmode 
        contentCP = contentCP.Replace("&", ""); 

       } 

       try 
       { 
        cpRenderElement.InnerXml = contentCP; 
       } 
       catch (Exception e) 
       { 
        cpRenderElement.InnerXml = "Malformed XML in the output:" + e.Message;// +"<!--" + contentCP + "-->"; 
       } 
       cpNode.AppendChild(cpRenderElement); 



       Component component = (Component)m_Engine.GetObject(componentURI); 
       XmlAttribute attComponentRevisionDate = pageXml.CreateAttribute("ModifiedOn"); 
       attComponentRevisionDate.Value = component.RevisionDate.ToString("yyyy-MM-dd HH:mm:ss tt"); 
       cpNode.Attributes.Append(attComponentRevisionDate); 



       //Get the metadata from the Component 

       metadataXmlString = ""; 
       if (component.Metadata != null) 
       { 
        metadataXmlString = component.Metadata.OuterXml; 
       } 

       cpNode.SelectSingleNode("tcm:Component", NSManager).InnerXml = metadataXmlString; 
      } 



      //Add the rendered/published time 
      XmlAttribute attRenderTime = pageXml.CreateAttribute("RenderedAt"); 
      attRenderTime.Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss tt"); 
      pageXml.DocumentElement.Attributes.Append(attRenderTime); 

      //Add PublishInfo 
      //Get the PublishTransaction 

      PublishTransaction pubTrans = GetPublishTransaction(engine); 

      if (pubTrans != null) 
      { 
       XmlElement nodePublisher = pageXml.CreateElement("Publisher"); 
       XmlElement nodePublisherName = pageXml.CreateElement("name"); 
       XmlElement nodePublisherId = pageXml.CreateElement("id"); 
       XmlElement nodePublisherDescription = pageXml.CreateElement("description"); 

       nodePublisherName.InnerText = pubTrans.Creator.Title; 
       nodePublisher.AppendChild(nodePublisherName); 

       nodePublisherId.InnerText = pubTrans.Creator.Id.ToString(); 
       nodePublisher.AppendChild(nodePublisherId); 

       nodePublisherDescription.InnerText = pubTrans.Creator.Description; 
       nodePublisher.AppendChild(nodePublisherDescription); 

       pageXml.DocumentElement.AppendChild(nodePublisher); 
      } 

      //Add the target info 
      if (engine.PublishingContext.PublicationTarget != null) 
      { 
       XmlElement nodePublicationTarget = engine.PublishingContext.PublicationTarget.ToXml(); 
       XmlNode nodePubs = nodePublicationTarget.SelectSingleNode("/tcm:PublicationTarget/tcm:Data/tcm:Publications", NSManager); 
       nodePubs.ParentNode.RemoveChild(nodePubs); 


       pageXml.DocumentElement.AppendChild(pageXml.ImportNode(nodePublicationTarget, true)); 
      } 





      //Add the Page Modified time 
      ModificationInfo modInfo = GetNewestModificationDateFromPageXml(pageXml); 

      XmlAttribute attContentModifiedTime = pageXml.CreateAttribute("ContentLastModifiedOn"); 
      attContentModifiedTime.Value = modInfo.ModificationDate.ToString("yyyy-MM-dd HH:mm:ss tt"); 
      pageXml.DocumentElement.Attributes.Append(attContentModifiedTime); 

      XmlAttribute attLastModifiedItem = pageXml.CreateAttribute("LastModifiedItemURI"); 
      attLastModifiedItem.Value = modInfo.ItemURI.ToString(); 
      pageXml.DocumentElement.Attributes.Append(attLastModifiedItem); 

      XmlAttribute attLastModifiedTitle = pageXml.CreateAttribute("LastModifiedItemTitle"); 
      attLastModifiedTitle.Value = modInfo.ItemTitle; 
      pageXml.DocumentElement.Attributes.Append(attLastModifiedTitle); 




      //Add PageTemplate Properties 
      XmlNode nodePageTemplate = pageXml.SelectSingleNode("/tcm:Page/tcm:Data/tcm:PageTemplate", NSManager); 
      TcmUri uriPageTemplate = new TcmUri(nodePageTemplate.Attributes["href", "http://www.w3.org/1999/xlink"].Value); 
      XmlElement pageTemplateXml = engine.GetObject(uriPageTemplate).ToXml(XmlSections.Data); 
      nodePageTemplate.ParentNode.ReplaceChild(pageXml.ImportNode(pageTemplateXml, true), nodePageTemplate); 

      //Add the publication properties 
      XmlNode nodePublication = pageXml.SelectSingleNode("/tcm:Page/tcm:Context/tcm:Publication", NSManager); 
      TcmUri uriPublication = new TcmUri(nodePublication.Attributes["href", "http://www.w3.org/1999/xlink"].Value); 
      XmlElement publicationXml = engine.GetObject(uriPublication).ToXml(XmlSections.Data); 
      nodePublication.ParentNode.ReplaceChild(pageXml.ImportNode(publicationXml,true), nodePublication); 
      m_Package.PushItem("UrbanCherryPageFrameWork", m_Package.CreateXmlDocumentItem(ContentType.Xml,pageXml)); 
     } 
コンポーネントテンプレートメタデータに基づいてコンテンツ領域に分割ページのXMLを構築します

XmlDocument pageXml = pageItem.GetAsXmlDocument();行で停止し、その値をパッケージにプッシュしてOutputと呼ぶことができます。

また、DD4Tテンプレートも参照してください。これらのテンプレートは、ページの標準XML構造も出力します。

+0

提供できるサンプル出力はありますか?私はC#の男ではない。 お時間をいただきありがとうございました。 – lpk

+0

あなたはどんな技術を使いたいですか?ほぼ100%のXSLTでこれを行うのが有益かもしれませんが、あなたのソリューションのどこかにC#が少し必要です。 –

+0

私はJavaベースのソリューションを計画しています。 – lpk

4

実際には、Tridionの柔軟なデータモデルのおかげで、答えが非常に難しいことを求めています。

確かに知られているいくつかのことがあります:

  • ページが
    • ページのタイトル、ID、URL、出版物ID、バージョン、作成日などのプロパティ、公開された日付など
    を持っているがあります
  • ページは、コンポーネントのプレゼンテーション
    • コンポーネントのプレゼンテーションを有することができますこれはあなたのウェブサイトに表示したいデータがあるので、それら

成分の含有量(またはコンポーネントのセット)のコンテンツを持っていることは、最も可能性の高いあなたが探しているものです。コンポーネントは、Tridion Content ManagerにXMLとして保存され、公開時にテンプレートによって変換されます。コンポーネントが使用するXMLスキーマは実装者によって定義されるため(すべての実装では異なるスキーマを使用する可能性が高い)、そのコンポーネントを変換するテンプレートも実装者によって定義されるため、すべての実装が異なる出力を持つ可能性があります。だから、

、あなたが配信階層上のウェブサイトを構築するTridionのXMLを使用したい場合は、あなたがする必要があります。

  1. は、テンプレートを定義し、あなたのウェブサイトの要件
  2. に応じてコンテンツのためのスキーマを定義しますそれは、( - 任意の組織のため適切内容モデルを定義するのに必要な作業を過小評価しないでください、私はここに多くのことを簡素化しています)配送ティア

にXMLとしてあなたのコンテンツを公開します

ChrisはXMLを配信層にプッシュする方法の良い例を示しています。 DD4Tのようなフレームワークは、このテンプレートを「無料で」提供しますが、スキーマを自分で設計する必要があります。

+0

ページにはコンポーネントプレゼンテーションがあり、コンポーネントにはコンテンツがマップされています。したがって、ページとコンテンツの関係はコンポーネントを介して行われます。だから私の要件は、私がページを公開する場合です。上記の構造にXMLを作成する必要があります。これには、使用するスタイル、コンテンツにマッピングされるスタイルなどのコンポーネントの詳細が含まれます。 あなたの貴重な時間と答えをありがとう。 – lpk

+0

クリスが提供するテンプレートがそれを実現します。あなたのTidionの経験がある人(あなたのクライアントから多分)にTridionのテンプレートに入れるよう頼みましょう。 –

+0

私はこれがクライアントに話す前に達成可能かどうかを知りたがっています。 – lpk

関連する問題