I created XML files for my menus and an XSL file to transform them into HTML. Here is the code from my MenuFromXML Class.
Private WithEvents mySiteScanner As SiteScanner Private strMainMenu As String Private strNoteBookMenu As String Private strWroxMenu As String Private Sub mySiteScanner_WebPage(aPage As PageWindow) InsertMenu aPage.Close True End Sub Public Sub UpdateMenuFromXML() GetMenus Set mySiteScanner = New SiteScanner mySiteScanner.Recursive = True mySiteScanner.EnumPageWindows End Sub Private Sub GetMenus() Dim source As MSXML2.DOMDocument30 Set source = New MSXML2.DOMDocument30 Dim style As MSXML2.DOMDocument30 Set style = New MSXML2.DOMDocument30 style.Load "c:\web3\spider\_xml\menu3.xsl" source.Load "c:\web3\spider\_xml\mmenu.xml" strMainMenu = source.transformNode(style.documentElement) source.Load "c:\web3\spider\_xml\nbmenu.xml" strNoteBookMenu = source.transformNode(style.documentElement) source.Load "c:\web3\spider\_xml\wmenu.xml" strWroxMenu = source.transformNode(style.documentElement) End Sub Private Sub InsertMenu() Dim fpDoc As IHTMLDocument2 Set fpDoc = ActiveDocument Dim myTable As IHTMLTable Dim colTables As IHTMLElementCollection Set colTables = fpDoc.all.tags("table") Dim sepDivs As IHTMLElementCollection Dim bIsChanged As Boolean For Each myTable In colTables bIsChanged = False If myTable.Id = "menu" Or myTable.Id = "mmenu" Then myTable.outerHTML = strMainMenu bIsChanged = True Else If myTable.Id = "nbmenu" Then myTable.outerHTML = strNoteBookMenu bIsChanged = True Else If myTable.Id = "wmenu" Then myTable.outerHTML = strWroxMenu bIsChanged = True End If End If End If If bIsChanged Then Set sepDivs = fpDoc.all.tags("div") Dim myDiv As IHTMLDivElement Dim n As Integer n = sepDivs.Length - 1 For j = n To 0 Step -1 Set myDiv = sepDivs(j) If myDiv.Id = "separator" Then myDiv.outerHTML = "<hr>" End If Next End If Next End Sub
Here is the Macro which uses the MenuFromXML Class.
Sub MenuUpdate() Dim myMenu As New MenuFromXML myMenu.UpdateMenuFromXML End Sub
One problem I encountered was using <hr></hr> in my XSL file. This would cause the VBA to fail when executing the line myTable.outerHTML = strMainMenu. It looks like FrontPage considers <hr></hr> to be invalid HTML. You can't just put <hr> in your XSL file, because it would not be a well formed document and the parser would flag an error. My solution for now is to use a <div id="separator"></div> to my XSL file. In the VBA, I replace this div with an <hr> tag. The VBA must replace the <div> tags in the collection in reverse order, because they will disappear as the change is made, changing the contents of the collection. Using the normal For Each construct to work through the collection will cause the change to be applied to every other member of the collection.
Some improvements for the future: The section of code which parses the XML files and transforms them, needs to be more generic. The file names should be obtained from a configuration file, written in XML. I should go back to using <hr></hr> in the XSL file, and remove the </hr> from the string before assigning it to myTable.outerHTML. This would make the XML/XSL more usable in other environments. All workarounds for FrontPage limitations should be kept in the VBA Macros and not affect the nature of the XML/XSL files. It is also time to start using XSLT.
Comments