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结构. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |