{"id":4693,"date":"2008-02-21T15:22:00","date_gmt":"2008-02-21T15:22:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vbteam\/2008\/02\/21\/vb-xml-cookbook-recipe-1-xml-transformations-using-xml-literals-doug-rothaus\/"},"modified":"2024-07-05T14:33:11","modified_gmt":"2024-07-05T21:33:11","slug":"vb-xml-cookbook-recipe-1-xml-transformations-using-xml-literals-doug-rothaus","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/vbteam\/vb-xml-cookbook-recipe-1-xml-transformations-using-xml-literals-doug-rothaus\/","title":{"rendered":"VB XML Cookbook, Recipe 1: XML Transformations using XML Literals (Doug Rothaus)"},"content":{"rendered":"<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">I was working on a blog entry about replacing XSLT transforms with Visual Basic XML Literals. As the entry progressed, I noticed that it was really, really long. So, Avner Aharoni and I talked things over and we decided to break it up into multiple entries and start a series, much like the LINQ Cookbook that was started a few months back.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Introducing the VB XML Cookbook. We\u2019ll use these entries to show quick and easy solutions using XML Literals in Visual Basic. In many cases we\u2019ll reference XSLT and XPath where there\u2019s a direct (or very close) replacement of functionality. You\u2019ll find that consuming and transforming XML is quick and easy using XML Literals, XML Axis Properties, and LINQ to XML\u2014all of which are available starting with Visual Basic 2008.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">In this first entry, we\u2019ll show how you can perform simple XML transformations using XML Literals and LINQ. Each sample uses an embedded expression that returns a collection of XML Literals from a LINQ query or another source, such as a property or function that returns a collection of XML Literals. You will see how you can replace an entire XSLT transform with just a few lines of Visual Basic code.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Let\u2019s look at our first example. Attached to this blog entry is an XML file that contains a portion of the Contacts from the AdventureWorks sample database for SQL Server in an XML document (AWContacts.xml). Each <\/font><span>&lt;Contact&gt;<\/span><font face=\"Calibri\" size=\"3\"> element has an<\/font><span> &lt;EmailAddress&gt;<\/span><font face=\"Calibri\" size=\"3\"> sub-element. The following code creates a new XML document with just the e-mail addresses from the source document.<\/font><\/p>\n<p class=\"MsoNormal\"><span>Imports<\/span><span> <span>&lt;<\/span><span>xmlns<\/span><span>=<\/span><span>&#8220;<\/span><span>http:\/\/SampleSchema\/AWContacts<\/span><span>&#8220;<\/span><span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span>Public<\/span><span> <span>Class<\/span> XMLCookbook<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>Private<\/span><span> <span>Sub<\/span> Recipe1()<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>Dim<\/span> xmlDoc = XDocument.Load(<span>&#8220;AWContacts.xml&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>Dim<\/span> emailDoc = <span>&lt;?<\/span><span>xml<\/span> <span>version<\/span><span>=<\/span><span>&#8220;<\/span><span>1.0<\/span><span>&#8220;<\/span><span>?&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;<\/span><span>EmailAddresses<\/span><span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;%=<\/span> xmlDoc.<span>&lt;<\/span>Contacts<span>&gt;<\/span>.<span>&lt;<\/span>Contact<span>&gt;<\/span>.<span>&lt;<\/span>EmailAddress<span>&gt;<\/span> <span>%&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>&nbsp;&nbsp;<\/span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/span><span>&lt;\/<\/span><span>EmailAddresses<\/span><span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>&nbsp;&nbsp;<\/span>emailDoc.Save(<span>&#8220;EmailAddresses.xml&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>End Sub<\/span><span><\/span><\/p>\n<p class=\"MsoNormal\"><span>End Class<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">This would take considerably more effort using an XSLT transform. Here, you simply use Visual Basic to create a \u201ctemplate\u201d function, and use <\/font><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/bb384563.aspx\"><font face=\"Calibri\" size=\"3\">XML Literals<\/font><\/a><font face=\"Calibri\" size=\"3\"> to load and save the XML, as well as create the new XML document. The <\/font><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/bb384806.aspx\"><font face=\"Calibri\" size=\"3\">XML Child Axis property<\/font><\/a><font face=\"Calibri\" size=\"3\"> references the collection of <\/font><span>&lt;EmailAddress&gt;<\/span><font face=\"Calibri\" size=\"3\"> sub-elements. In place of the <\/font><span>&lt;xsl:copy-of&gt;<\/span><font face=\"Calibri\" size=\"3\"> element, you use an <\/font><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/bb384964.aspx\"><font face=\"Calibri\" size=\"3\">embedded expression<\/font><\/a><font face=\"Calibri\" size=\"3\"> to add the collection of elements to the new document. In the end, you\u2019ve transformed the document without XSLT or XPath. Let\u2019s take a look at what the XSLT (and Visual Basic Code) would look like for the same sample.<\/font><\/p>\n<p class=\"MsoNormal\"><strong><span><font size=\"3\">Recipe1.xslt<\/font><\/span><\/strong><\/p>\n<p class=\"MsoNormal\"><span>&lt;?<\/span><span>xml<\/span><span> <\/span><span>version<\/span><span>=<\/span><span>&#8216;<span>1.0<\/span>&#8216;<span>?&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;<\/span><span>xsl:stylesheet<\/span><span> <\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>version<\/span><span>=<\/span><span>&#8220;<span>1.0<\/span>&#8220;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:xsl<\/span><span>=<\/span><span>&#8220;<span>http:\/\/www.w3.org\/1999\/XSL\/Transform<\/span>&#8220;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:aw<\/span><span>=<\/span><span>&#8220;<span>http:\/\/SampleSchema\/AWContacts<\/span>&#8220;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:aci<\/span><span>=<\/span><span>&#8220;<span>http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/adventure-works\/ContactInfo<\/span>&#8220;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:crm<\/span><span>=<\/span><span>&#8220;<span>http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/adventure-works\/ContactRecord<\/span>&#8220;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><\/span><span>xmlns:act<\/span><span>=<\/span><span>&#8220;<span>http:\/\/schemas.microsoft.com\/sqlserver\/2004\/07\/adventure-works\/ContactTypes<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;<\/span><span>xsl:output<\/span><span> <\/span><span>method<\/span><span>=<\/span><span>&#8220;<span>xml<\/span>&#8220;<span> <\/span><span>indent<\/span><span>=<\/span>&#8220;<span>yes<\/span>&#8220;<span>\/&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;<\/span><span>xsl:template<\/span><span> <\/span><span>match<\/span><span>=<\/span><span>&#8220;<span>aw:Contacts<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>EmailAddresses<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:copy-of<\/span><span> <\/span><span>select<\/span><span>=<\/span><span>&#8220;<span>aw:Contact\/aw:EmailAddress<\/span>&#8220;<span>\/&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>EmailAddresses<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;\/<\/span><span>xsl:template<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span>&lt;\/<\/span><span>xsl:stylesheet<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><strong><span><font size=\"3\">Recipe1_XSLT Visual Basic Code<\/font><\/span><\/strong><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span>Public<\/span><span> <span>Class<\/span> XMLCookbook<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>Sub<\/span> Recipe1_XSLT()<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> xslTransform <span>As<\/span> <span>New<\/span> System.Xml.Xsl.XslCompiledTransform<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>xslTransform.Load(<span>&#8220;recipe1.xslt&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> reader = Xml.XmlReader.Create(<span>&#8220;AWContacts.xml&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> sw <span>As<\/span> <span>New<\/span> System.IO.StreamWriter(<span>&#8220;Recipe1.xml&#8221;<\/span>)<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Dim<\/span> writer = Xml.XmlWriter.Create(sw)<\/span><\/p>\n<p class=\"MsoNormal\"><span>&nbsp;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>xslTransform.Transform(reader, writer)<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>sw.Close()<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span><span>End<\/span> <span>Sub<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span>End Class<\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">The XSLT version turns out to be about twice the amount of code and, to be honest, took me much longer to create than the VB version. Notice that the XML namespace support in Visual Basic is simpler than XSLT (1.0) as I can define a default XML namespace for XML elements that do not have an XML namespace identified.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Another important thing to mention is that part of the productivity gain comes from the Intellisense support provided with XML Literals in Visual Basic. By adding the schema files that are also attached to this blog entry and then importing the namespaces for the schemas, I get word completion lists for XML child and descendant elements as well as attributes. For more information, see <\/font><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/bb531325.aspx\"><font face=\"Calibri\" size=\"3\">XML Intellisense in Visual Basic<\/font><\/a><font face=\"Calibri\" size=\"3\">.<\/font><\/p>\n<p class=\"MsoNormal\"><strong><span><font size=\"3\">Using LINQ<\/font><\/span><\/strong><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">To go further, you can add query functionality to your transform using LINQ. In XSLT, you might use the &lt;xsl:for-each&gt; element to loop through results and the &lt;xsl:if&gt; element to test for a particular condition. Using LINQ, you can accomplish this rather easily. <\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">For example, in our source document, each <\/font><span>&lt;Contact&gt;<\/span><font face=\"Calibri\" size=\"3\"> element has an <\/font><span>&lt;EmailPromotion&gt;<\/span><font face=\"Calibri\" size=\"3\"> sub-element that identifies whether the contact would like to receive promotion e-mails from the company. The following code creates the same document, but only containing e-mail addresses of contacts that want to receive e-mail promotions.<\/font><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>Dim<\/span> promoList = <span>&lt;?<\/span><span>xml<\/span> <span>version<\/span><span>=<\/span><span>&#8220;<\/span><span>1.0<\/span><span>&#8220;<\/span><span>?&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>EmailPromotionList<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;%=<\/span> <span>From<\/span> contact <span>In<\/span> xmlDoc.<span>&lt;<\/span>Contacts<span>&gt;<\/span>.<span>&lt;<\/span>Contact<span>&gt;<\/span> _<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Where<\/span> contact.<span>&lt;<\/span>EmailPromotion<span>&gt;<\/span>.Value &gt; 0 _<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Select<\/span> contact.<span>&lt;<\/span>EmailAddress<span>&gt;<\/span> <span>%&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;\/<\/span><span>EmailPromotionList<\/span><span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Comparable XSLT code would look like the following.<\/font><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;<\/span><span>xsl:template<\/span><span> <\/span><span>match<\/span><span>=<\/span><span>&#8220;<span>aw:Contacts<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>EmailAddresses<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:for-each<\/span><span> <\/span><span>select<\/span><span>=<\/span><span>&#8220;<span>aw:Contact<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:if<\/span><span> <\/span><span>test<\/span><span>=<\/span><span>&#8220;<span>aw:EmailPromotion <\/span><span>&amp;gt;<\/span><span> 0<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:copy-of<\/span><span> <\/span><span>select<\/span><span>=<\/span><span>&#8220;<span>aw:EmailAddress<\/span>&#8220;<span>\/&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>xsl:if<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>xsl:for-each<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>EmailAddresses<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;\/<\/span><span>xsl:template<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">For the last example, we\u2019ll go one step further and transform the contents of the source XML document to a new format. You can accomplish this by having a LINQ query return a collection of XML Literals. You can use embedded expressions to copy values from the source document into elements and attributes of the new XML Literal. For this example, the transformed document will rename the <\/font><span>&lt;EmailAddress&gt; <\/span><font face=\"Calibri\" size=\"3\">element to <\/font><span>&lt;Email&gt;<\/span><font face=\"Calibri\" size=\"3\">, and include the value of the <\/font><span>&lt;EmailPromotion&gt;<\/span><font face=\"Calibri\" size=\"3\"> element as an attribute of the transformed <\/font><span>&lt;Email&gt;<\/span><font face=\"Calibri\" size=\"3\"> element.<\/font><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span><span>Dim<\/span> transformList = <span>&lt;?<\/span><span>xml<\/span> <span>version<\/span><span>=<\/span><span>&#8220;<\/span><span>1.0<\/span><span>&#8220;<\/span><span>?&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;<\/span><span>EmailPromotionList<\/span><span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;%=<\/span> <span>From<\/span> contact <span>In<\/span> xmlDoc.<span>&lt;<\/span>Contacts<span>&gt;<\/span>.<span>&lt;<\/span>Contact<span>&gt;<\/span> _<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Where<\/span> contact.<span>&lt;<\/span>EmailPromotion<span>&gt;<\/span>.Value &gt; 0 _<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>Select<\/span> <span>&lt;<\/span><span>Email<\/span> <\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>promotion<\/span><span>=<\/span><span>&lt;%=<\/span> contact.<span>&lt;<\/span>EmailPromotion<span>&gt;<\/span>.Value <span>%&gt;<\/span><span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;%=<\/span> contact.<span>&lt;<\/span>EmailAddress<span>&gt;<\/span>.Value <span>%&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;\/<\/span><span>Email<\/span><span>&gt;<\/span> <span>%&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><span>&lt;\/<\/span><span>EmailPromotionList<\/span><span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Comparable XSLT code would look like the following.<\/font><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;<\/span><span>xsl:template<\/span><span> <\/span><span>match<\/span><span>=<\/span><span>&#8220;<span>aw:Contacts<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>EmailPromotionList<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:for-each<\/span><span> <\/span><span>select<\/span><span>=<\/span><span>&#8220;<span>aw:Contact<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:if<\/span><span> <\/span><span>test<\/span><span>=<\/span><span>&#8220;<span>aw:EmailPromotion <\/span><span>&amp;gt;<\/span><span> 0<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>Email<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:attribute<\/span><span> <\/span><span>name<\/span><span>=<\/span><span>&#8220;<span>promotion<\/span>&#8220;<span>&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:value-of<\/span><span> <\/span><span>select<\/span><span>=<\/span><span>&#8220;<span>aw:EmailPromotion<\/span>&#8220;<span>\/&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>xsl:attribute<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;<\/span><span>xsl:value-of<\/span><span> <\/span><span>select<\/span><span>=<\/span><span>&#8220;<span>aw:EmailAddress<\/span>&#8220;<span>\/&gt;<\/span><\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>Email<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>xsl:if<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>xsl:for-each<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp;&nbsp;&nbsp; <\/span>&lt;\/<\/span><span>EmailPromotionList<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><span><span>&nbsp; <\/span>&lt;\/<\/span><span>xsl:template<\/span><span>&gt;<\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">To sum things up, we\u2019ve seen how Visual Basic, XML Literals and LINQ can be used in place of the &lt;xsl:copy-of&gt;, &lt;xsl:for-each&gt;, &lt;xsl:template&gt;, &lt;xsl:if&gt;, &lt;xsl:value-of&gt;, and &lt;xsl:attribute&gt; elements as well as using XML Axis Properties in place of XPath to create a powerful, yet simple tool for XML transformations.<\/font><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">Stay tuned for more&#8230;<\/font><\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Components.PostAttachments\/00\/07\/84\/17\/31\/AdventureWorksContacts.zip\">AdventureWorksContacts.zip<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I was working on a blog entry about replacing XSLT transforms with Visual Basic XML Literals. As the entry progressed, I noticed that it was really, really long. So, Avner Aharoni and I talked things over and we decided to break it up into multiple entries and start a series, much like the LINQ Cookbook [&hellip;]<\/p>\n","protected":false},"author":260,"featured_media":8818,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[192,195],"tags":[59,94,117,163,166,185],"class_list":["post-4693","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-featured","category-visual-basic","tag-doug-rothaus","tag-linqvb9","tag-orcas","tag-vb-xml-cookbook","tag-vb2008","tag-xml"],"acf":[],"blog_post_summary":"<p>I was working on a blog entry about replacing XSLT transforms with Visual Basic XML Literals. As the entry progressed, I noticed that it was really, really long. So, Avner Aharoni and I talked things over and we decided to break it up into multiple entries and start a series, much like the LINQ Cookbook [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/4693","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/users\/260"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/comments?post=4693"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/posts\/4693\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media\/8818"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/media?parent=4693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/categories?post=4693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/vbteam\/wp-json\/wp\/v2\/tags?post=4693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}