加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SDL Tridion:XML格式的页面的逻辑结构

发布时间:2020-12-16 05:35:23 所属栏目:百科 来源:网络整理
导读:是否可以以xml格式提取SDL Tridion页面的信息,包括与其关联的内容. 我期待类似的东西: page name="mypagename" page id="xxxxx"/ template name="abc" id="123" container name="xyz" content name="asd" id="123" Path="" /content /container /template
是否可以以xml格式提取SDL Tridion页面的信息,包括与其关联的内容.

我期待类似的东西:

<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的新手,所以很少有详细的答案会非常有帮助.

根据您的实际需要,有很多简单的方法可以做到这一点,但我使用下面用C#编写的TBB类构建一个基于组件模板元数据划分为内容区域的页面XML
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,nodePublication);
            m_Package.PushItem("UrbanCherryPageFrameWork",m_Package.CreateXmlDocumentItem(ContentType.Xml,pageXml));
        }

您可以在XmlDocument pageXml = pageItem.GetAsXmlDocument();行停止,只需将该值推入包中并将其命名为Output.

或者看一下DD4T模板,因为它们也为页面输出标准的XML结构.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读