Welcome!

Microsoft Cloud Authors: Nick Basinger, Kevin Benedict, Pat Romanski, Liz McMillan, Lori MacVittie

Related Topics: Microsoft Cloud, Silverlight

Microsoft Cloud: Blog Feed Post

Provision a Document Set Using CAML

CAML is very possible and most people don’t realize how much you can do with it

When it comes to deploying SharePoint artifacts, I pretty much always insist on doing as much as possible using a feature and CAML as opposed to using the UI or writing code.  CAML is very possible and most people don’t realize how much you can do with it.  The XML scares a lot of people but there are a lot of techniques you can use now in SharePoint 2010 to avoid writing a lot of this manually.  This article assumes you have some familiarity in deploying content types and site columns using a feature.  If you need more information on this, feel free to ask and I’ll post more on it.

As you probably know a Document Set is simply a content type which contains other content types.  For today’s example, I’m going to deploy a Document Set called Work Order. It will contain two child content types: Contract and Invoice.  Let’s look at these child content types real quick.  Both inherit from Document and I only specifically list my custom site columns in it.

Here is what Contract looks like:

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

<ContentType ID="0x0101000F9EF6A4CF6E7046A227BC48222671DC" Name="Contract" Group="Custom Content Types" Overwrite="TRUE" xmlns="http://schemas.microsoft.com/sharepoint/">

<Folder TargetName="_cts/Contract" />

<FieldRefs>

 

<FieldRef ID="{6d392ce3-12e0-49f7-ba79-04f2b2e67269}" Name="Contract_x0020_Number" />

 

<FieldRef ID="{f7b6fc7c-eb22-43dd-89a5-799874d7a5d7}" Name="Effective_x0020_Date" />

</FieldRefs>

<XmlDocuments>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">

<FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">

<Display>DocumentLibraryForm</Display>

<Edit>DocumentLibraryForm</Edit>

<New>DocumentLibraryForm</New>

</FormTemplates>

</XmlDocument>

</XmlDocuments>

</ContentType>

</Elements>

My Invoice content type looks quite similar.  Note that the Contract Number field is shared between the two content types.

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

<ContentType ID="0x0101006754EF61193E3942B6851FBE641DD21E" Name="Invoice" Group="Custom Content Types" Overwrite="TRUE" xmlns="http://schemas.microsoft.com/sharepoint/">

<Folder TargetName="_cts/Invoice" />

<FieldRefs>

<FieldRef ID="{6d392ce3-12e0-49f7-ba79-04f2b2e67269}" Name="Contract_x0020_Number" />

<FieldRef ID="{1dfcbcef-d1e1-42a1-bd59-a2079cc7ca36}" Name="Amount" />

</FieldRefs>

<XmlDocuments>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">

<FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">

<Display>DocumentLibraryForm</Display>

<Edit>DocumentLibraryForm</Edit>

<New>DocumentLibraryForm</New>

</FormTemplates>

</XmlDocument>

</XmlDocuments>

</ContentType>

</Elements>

Now how do we deploy the Document Set?  It’s actually not that complicated.  We define it just like a regular content type that inherits from Content Type Id 0x0120D520.  Here is what the first line looks like in the elements.xml for my Document Set.  As you can see, I started with that Content Type Id and appended 00, plus my own GUID (minus dashes and brackets).

<ContentType ID="0x0120D5200032EBDCE82398324CAD4E4E21C3233AA7" Name="Work Order" Group="Custom Content Types" Overwrite="TRUE" ProgId="SharePoint.DocumentSet" PushDownChangedResourceFilesOnly="TRUE" xmlns="http://schemas.microsoft.com/sharepoint/">

In the next section, I reference my custom site columns, Contract Number.  I included all of the other FieldRef elements that are inherited but I expect you can leave them out.

<FieldRefs>

<FieldRef ID="{c042a256-787d-4a6f-8a8a-cf6ab767f12d}" Name="ContentType" />

<FieldRef ID="{b824e17e-a1b3-426e-aecf-f0184d900485}" Name="ItemChildCount" />

<FieldRef ID="{960ff01f-2b6d-4f1b-9c3f-e19ad8927341}" Name="FolderChildCount" />

<FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" Required="FALSE" Hidden="TRUE" />

<FieldRef ID="{8553196d-ec8d-4564-9861-3dbe931050c8}" Name="FileLeafRef" Required="TRUE" Hidden="FALSE" />

<FieldRef ID="{cbb92da4-fd46-4c7d-af6c-3128c2a5576e}" Name="Description" ShowInNewForm="TRUE" ShowInEditForm="TRUE" />

<FieldRef ID="{6d392ce3-12e0-49f7-ba79-04f2b2e67269}" Name="Contract_x0020_Number" />

</FieldRefs>

The rest of the magic behind Document Sets exists in the XmlDocuments section of the content type.  I won’t describe all of them but I will include the ones that are of interest.  The most important section describes which content types are in the Document Set.  You need to include one AllowedContentType element for each content type included.  In this case, I have the Content Type Ids for Document, Contract, and Invoice.

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/allowedcontenttypes">

<act:AllowedContentTypes xmlns:act="http://schemas.microsoft.com/office/documentsets/allowedcontenttypes" LastModified="11/29/2010 18:57:35">

<AllowedContentType id="0x0101" />

<AllowedContentType id="0x0101000F9EF6A4CF6E7046A227BC48222671DC" />

<AllowedContentType id="0x0101006754EF61193E3942B6851FBE641DD21E" />

</act:AllowedContentTypes>

</XmlDocument>

The SharedField element specifies which fields are shared between content types.  The value of this site column set at the Document Set level will be written into the child content types automatically.

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/sharedfields">

<sf:SharedFields xmlns:sf="http://schemas.microsoft.com/office/documentsets/sharedfields" LastModified="11/29/2010 18:58:08">

<SharedField id="6d392ce3-12e0-49f7-ba79-04f2b2e67269" />

</sf:SharedFields>

</XmlDocument>

The WelcomePageField element controls which site columns show up on the welcome page of the content type.  In this case I want the Contract Number displayed so I include that site column’s Id.

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/welcomepagefields">

<wpf:WelcomePageFields xmlns:wpf="http://schemas.microsoft.com/office/documentsets/welcomepagefields" LastModified="11/29/2010 18:58:08">

<WelcomePageField id="6d392ce3-12e0-49f7-ba79-04f2b2e67269" />

</wpf:WelcomePageFields>

</XmlDocument>

Document Sets also give you the ability to create default documents for each content type in the set.  The DefaultDocument element is how you do this by specifying a filename and a Content Type Id.  I’ll talk about how you actually get the files deployed in the right place here in a little bit.

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/defaultdocuments">

<dd:DefaultDocuments xmlns:dd="http://schemas.microsoft.com/office/documentsets/defaultdocuments" LastModified="11/29/2010 17:06:58" AddSetName="True">

<DefaultDocument name="Contract Template.docx" idContentType="0x0101000F9EF6A4CF6E7046A227BC48222671DC" />

<DefaultDocument name="Invoice Template.xlsx" idContentType="0x0101006754EF61193E3942B6851FBE641DD21E" />

</dd:DefaultDocuments>

</XmlDocument>

Here is what the whole elements.xml file looks like for my document set.  I omitted details on a few of the XmlDocument elements but they seem to always have the same values.

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

<ContentType ID="0x0120D5200032EBDCE82398324CAD4E4E21C3233AA7" Name="Work Order" Group="Custom Content Types" Overwrite="TRUE" ProgId="SharePoint.DocumentSet" PushDownChangedResourceFilesOnly="TRUE" xmlns="http://schemas.microsoft.com/sharepoint/">

<Folder TargetName="_cts/Work Order" />

<FieldRefs>

<FieldRef ID="{c042a256-787d-4a6f-8a8a-cf6ab767f12d}" Name="ContentType" />

<FieldRef ID="{b824e17e-a1b3-426e-aecf-f0184d900485}" Name="ItemChildCount" />

<FieldRef ID="{960ff01f-2b6d-4f1b-9c3f-e19ad8927341}" Name="FolderChildCount" />

<FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" Required="FALSE" Hidden="TRUE" />

<FieldRef ID="{8553196d-ec8d-4564-9861-3dbe931050c8}" Name="FileLeafRef" Required="TRUE" Hidden="FALSE" />

<FieldRef ID="{cbb92da4-fd46-4c7d-af6c-3128c2a5576e}" Name="Description" ShowInNewForm="TRUE" ShowInEditForm="TRUE" />

<FieldRef ID="{6d392ce3-12e0-49f7-ba79-04f2b2e67269}" Name="Contract_x0020_Number" />

</FieldRefs>

<XmlDocuments>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/defaultdocuments">

<dd:DefaultDocuments xmlns:dd="http://schemas.microsoft.com/office/documentsets/defaultdocuments" LastModified="11/29/2010 17:06:58" AddSetName="True">

<DefaultDocument name="Contract Template.docx" idContentType="0x0101000F9EF6A4CF6E7046A227BC48222671DC" />

<DefaultDocument name="Invoice Template.xlsx" idContentType="0x0101006754EF61193E3942B6851FBE641DD21E" />

</dd:DefaultDocuments>

</XmlDocument>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/welcomepageview">

<WelcomePageView xmlns="http://schemas.microsoft.com/office/documentsets/welcomepageview" LastModified="1/1/1 0:00:01 AM" />

</XmlDocument>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/allowedcontenttypes">

<act:AllowedContentTypes xmlns:act="http://schemas.microsoft.com/office/documentsets/allowedcontenttypes" LastModified="11/29/2010 18:57:35">

<AllowedContentType id="0x0101" />

<AllowedContentType id="0x0101000F9EF6A4CF6E7046A227BC48222671DC" />

<AllowedContentType id="0x0101006754EF61193E3942B6851FBE641DD21E" />

</act:AllowedContentTypes>

</XmlDocument>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/sharedfields">

<sf:SharedFields xmlns:sf="http://schemas.microsoft.com/office/documentsets/sharedfields" LastModified="11/29/2010 18:58:08">

<SharedField id="6d392ce3-12e0-49f7-ba79-04f2b2e67269" />

</sf:SharedFields>

</XmlDocument>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/office/documentsets/welcomepagefields">

<wpf:WelcomePageFields xmlns:wpf="http://schemas.microsoft.com/office/documentsets/welcomepagefields" LastModified="11/29/2010 18:58:08">

<WelcomePageField id="6d392ce3-12e0-49f7-ba79-04f2b2e67269" />

</wpf:WelcomePageFields>

</XmlDocument>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">

<FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">

<Display>ListForm</Display>

<Edit>ListForm</Edit>

<New>DocSetDisplayForm</New>

</FormTemplates>

</XmlDocument>

<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url">

<FormUrls xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url">

<New>_layouts/NewDocSet.aspx</New>

</FormUrls>

</XmlDocument>

</XmlDocuments>

</ContentType>

</Elements>

Note the path specified in the folder element as this is important.  I mentioned that there were extra steps involved in deploying the default documents.  For this we need a module element.  We also need this module element to deploy the actual page that is displayed when you view the document set.  Start by creating a new module in Visual Studio 2010.  In the module, create a folder called _cts.  Then create a subfolder under that which is unique to your content type.  In this case, I named it Work Order to match the name of my content type.  Now we need to get a copy of the page that displays when you view the document set.  By default, this file is called docsethomepage.aspx.  You can find it in 14\FEATURES\DocumentSet. You can also get it by exporting a site template that has a document set.  You import the .wsp file in Visual Studio and then look for the corresponding cts module entry.  The last step is a bit more involved, but it is how I determined which web parts to include in the module element.  Drag this page into your module folder along with the default documents you want for your content type (i.e.: Contact Template.docx and Invoice Template.xlsx).

Here is what my completed module elements.xml looks like.

<?xml version="1.0" encoding="utf-8"?>

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

<Module Name="WorkOrderCts">

<File Path="WorkOrderCts\_cts\Work Order\docsethomepage.aspx" Url="_cts/Work Order/docsethomepage.aspx">

<AllUsersWebPart WebPartOrder="0" WebPartZoneID="WebPartZone_TopLeft" ID="g_737f2b01_0a4b_4cd9_9c5e_658e2ad65920">

<![CDATA[<WebPart xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/WebPart/v2">

<Title>Image</Title>

<FrameType>Default</FrameType>

<Description>Use to display pictures and photos.</Description>

<IsIncluded>true</IsIncluded>

<ZoneID>WebPartZone_TopLeft</ZoneID>

<PartOrder>0</PartOrder>

<FrameState>Normal</FrameState>

<AllowRemove>true</AllowRemove>

<AllowZoneChange>true</AllowZoneChange>

<AllowMinimize>true</AllowMinimize>

<AllowConnect>true</AllowConnect>

<AllowEdit>true</AllowEdit>

<AllowHide>true</AllowHide>

<IsVisible>true</IsVisible>

<HelpMode>Modeless</HelpMode>

<Dir>Default</Dir>

<MissingAssembly>Cannot import this Web Part.</MissingAssembly>

<Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>

<TypeName>Microsoft.SharePoint.WebPartPages.ImageWebPart</TypeName>

<ImageLink xmlns="http://schemas.microsoft.com/WebPart/v2/Image">/_layouts/images/docset_welcomepage_big.png</ImageLink>

</WebPart>]]>

</AllUsersWebPart>

<AllUsersWebPart WebPartOrder="0" WebPartZoneID="WebPartZone_CenterMain" ID="g_8882074f_409f_4ce4_8fb9_7e4ce9aa1d93">

<![CDATA[<WebPart xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/WebPart/v2">

<Title>Document Set Contents</Title>

<FrameType>Default</FrameType>

<Description>Displays the contents of the Document Set.</Description>

<IsIncluded>true</IsIncluded>

<ZoneID>WebPartZone_CenterMain</ZoneID>

<PartOrder>0</PartOrder>

<FrameState>Normal</FrameState>

<AllowRemove>true</AllowRemove>

<AllowZoneChange>true</AllowZoneChange>

<AllowMinimize>true</AllowMinimize>

<AllowConnect>true</AllowConnect>

<AllowEdit>true</AllowEdit>

<AllowHide>true</AllowHide>

<IsVisible>true</IsVisible>

<HelpMode>Modeless</HelpMode>

<Dir>Default</Dir>

<MissingAssembly>Cannot import this Web Part.</MissingAssembly>

<PartImageLarge>/_layouts/images/msimagel.gif</PartImageLarge>

<Assembly>Microsoft.Office.DocumentManagement, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>

<TypeName>Microsoft.Office.Server.WebControls.DocumentSetContentsWebPart</TypeName>

</WebPart>]]>

</AllUsersWebPart>

<AllUsersWebPart WebPartOrder="0" WebPartZoneID="WebPartZone_Top" ID="g_357da23e_61eb_473c_8eac_5609fc574329">

<![CDATA[<WebPart xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/WebPart/v2">

<Title>Document Set Properties</Title>

<FrameType>Default</FrameType>

<Description>Displays the properties of the Document Set.</Description>

<IsIncluded>true</IsIncluded>

<ZoneID>WebPartZone_Top</ZoneID>

<PartOrder>0</PartOrder>

<FrameState>Normal</FrameState>

<AllowRemove>true</AllowRemove>

<AllowZoneChange>true</AllowZoneChange>

<AllowMinimize>true</AllowMinimize>

<AllowConnect>true</AllowConnect>

<AllowEdit>true</AllowEdit>

<AllowHide>true</AllowHide>

<IsVisible>true</IsVisible>

<HelpMode>Modeless</HelpMode>

<Dir>Default</Dir>

<MissingAssembly>Cannot import this Web Part.</MissingAssembly>

<PartImageLarge>/_layouts/images/msimagel.gif</PartImageLarge>

<Assembly>Microsoft.Office.DocumentManagement, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>

<TypeName>Microsoft.Office.Server.WebControls.DocumentSetPropertiesWebPart</TypeName>

</WebPart>]]>

</AllUsersWebPart>

</File>

<File Path="WorkOrderCts\_cts\Work Order\Invoice Template.xlsx" Url="_cts/Work Order/Invoice Template.xlsx" />

<File Path="WorkOrderCts\_cts\Work Order\Contract Template.docx" Url="_cts/Work Order/Contract Template.docx" />

</Module>

</Elements>

The three web parts included in the docsethomepage.aspx file element display the details of the documents set when a user views the page.  If you want to customize this page, you could add web parts here or customize docsethomepage.aspx itself.  In this section make sure the Url element of each File element contains the path specified in the Folder element of the Document Set content type (_cts/Work Order in this case).  With all this put together, your Visual Studio project will look something like this.

DocumentSetVisualStudio

At this point, you can deploy this solution.  Make sure the destination site collection has the Document Sets feature activated otherwise things won’t work right.  If all goes well, you will have a working Document Set with all of the settings you specified.  You can go to the Content Types page, edit your content type and look at the Document Set Settings link to verify that it was create successfully.

DocumentSetSettings

If everything looks good with your content type, add it to a document library and try creating a new Document Set.  If it works right, you will have a new instance of your Document Set and you will see a page like the one below.

DocumentSetExample

As you can see, it successfully created the default documents and it is displaying my Contract Number field.

Ok, this process may seem a bit involved at this point but it’s really not bad.  You can always create this stuff in the UI and then export as site template.  Once you export a site template, you can import the pieces you want into a new project.  I’ll write up a post on this topic in the future as it is a great way to learn how SharePoint 2010 works behind the scenes.

Read the original blog entry...

More Stories By Corey Roth

Corey Roth, a SharePoint Server MVP, is an independent consultant specializing in Cloud technologies such as Azure and Office 365. He also specializes in mobile development. Corey serves as the product manager for two cloud-first mobile app platforms: BrewZap and HappenZap.

IoT & Smart Cities Stories
Bill Schmarzo, author of "Big Data: Understanding How Data Powers Big Business" and "Big Data MBA: Driving Business Strategies with Data Science," is responsible for setting the strategy and defining the Big Data service offerings and capabilities for EMC Global Services Big Data Practice. As the CTO for the Big Data Practice, he is responsible for working with organizations to help them identify where and how to start their big data journeys. He's written several white papers, is an avid blogge...
Nicolas Fierro is CEO of MIMIR Blockchain Solutions. He is a programmer, technologist, and operations dev who has worked with Ethereum and blockchain since 2014. His knowledge in blockchain dates to when he performed dev ops services to the Ethereum Foundation as one the privileged few developers to work with the original core team in Switzerland.
René Bostic is the Technical VP of the IBM Cloud Unit in North America. Enjoying her career with IBM during the modern millennial technological era, she is an expert in cloud computing, DevOps and emerging cloud technologies such as Blockchain. Her strengths and core competencies include a proven record of accomplishments in consensus building at all levels to assess, plan, and implement enterprise and cloud computing solutions. René is a member of the Society of Women Engineers (SWE) and a m...
Andrew Keys is Co-Founder of ConsenSys Enterprise. He comes to ConsenSys Enterprise with capital markets, technology and entrepreneurial experience. Previously, he worked for UBS investment bank in equities analysis. Later, he was responsible for the creation and distribution of life settlement products to hedge funds and investment banks. After, he co-founded a revenue cycle management company where he learned about Bitcoin and eventually Ethereal. Andrew's role at ConsenSys Enterprise is a mul...
In his general session at 19th Cloud Expo, Manish Dixit, VP of Product and Engineering at Dice, discussed how Dice leverages data insights and tools to help both tech professionals and recruiters better understand how skills relate to each other and which skills are in high demand using interactive visualizations and salary indicator tools to maximize earning potential. Manish Dixit is VP of Product and Engineering at Dice. As the leader of the Product, Engineering and Data Sciences team at D...
Dynatrace is an application performance management software company with products for the information technology departments and digital business owners of medium and large businesses. Building the Future of Monitoring with Artificial Intelligence. Today we can collect lots and lots of performance data. We build beautiful dashboards and even have fancy query languages to access and transform the data. Still performance data is a secret language only a couple of people understand. The more busine...
Whenever a new technology hits the high points of hype, everyone starts talking about it like it will solve all their business problems. Blockchain is one of those technologies. According to Gartner's latest report on the hype cycle of emerging technologies, blockchain has just passed the peak of their hype cycle curve. If you read the news articles about it, one would think it has taken over the technology world. No disruptive technology is without its challenges and potential impediments t...
If a machine can invent, does this mean the end of the patent system as we know it? The patent system, both in the US and Europe, allows companies to protect their inventions and helps foster innovation. However, Artificial Intelligence (AI) could be set to disrupt the patent system as we know it. This talk will examine how AI may change the patent landscape in the years to come. Furthermore, ways in which companies can best protect their AI related inventions will be examined from both a US and...
Bill Schmarzo, Tech Chair of "Big Data | Analytics" of upcoming CloudEXPO | DXWorldEXPO New York (November 12-13, 2018, New York City) today announced the outline and schedule of the track. "The track has been designed in experience/degree order," said Schmarzo. "So, that folks who attend the entire track can leave the conference with some of the skills necessary to get their work done when they get back to their offices. It actually ties back to some work that I'm doing at the University of San...
When talking IoT we often focus on the devices, the sensors, the hardware itself. The new smart appliances, the new smart or self-driving cars (which are amalgamations of many ‘things'). When we are looking at the world of IoT, we should take a step back, look at the big picture. What value are these devices providing. IoT is not about the devices, its about the data consumed and generated. The devices are tools, mechanisms, conduits. This paper discusses the considerations when dealing with the...