MSXML XHTML и встроенный CSS - PullRequest
0 голосов
/ 29 июня 2010

У меня есть книга Excel, которая используется в качестве отправной точки для создания заполняемой пользователем формы в нашей внутренней системе. Как помощник для пользователей, создающих эту книгу, я пытаюсь добавить функцию предварительного просмотра, которая берет эту электронную таблицу, выполняет магию VBA для генерации HTML-файла и затем отображает ее в своем браузере.

У меня есть базовая структура, использующая MSXML для написания XHTML, пока что все хорошо. Теперь у меня проблема с встраиванием таблицы стилей.

Таблица стилей содержится в строке в коде VBA, и я пытаюсь добавить ее в тег <style> в заголовке, что довольно просто. Проблема в том, что я использую селекторы CSS в таблице стилей, и > вызывает у меня проблемы, поскольку MSXML хочет закодировать это как escape-последовательность XML, нарушая CSS. Я пытался добавить таблицу стилей в блок CDATA, но затем браузер просто игнорирует ее.

tl; dr: Как вставить таблицу стилей, содержащую >, в файл HTML, созданный с помощью MSXML?

РЕДАКТИРОВАТЬ: Вот блок кода, который воспроизводит это поведение. Поместите его в Sub в Excel или в программу на VBA по вашему выбору, запустите ее и просмотрите исходный код:

Dim doc As DOMDocument
Dim htmlRoot As IXMLDOMElement
Dim bodyRoot As IXMLDOMElement
Dim headRoot As IXMLDOMElement
Dim style As IXMLDOMElement

Set doc = New DOMDocument
Set htmlRoot = doc.createElement("html")
Set bodyRoot = doc.createElement("body")
Set headRoot = doc.createElement("head")

Set style = doc.createElement("style")
style.appendChild doc.createTextNode(".section>.title{font-weight: bold;}")
style.setAttribute "type", "text/css"

headRoot.appendChild style

htmlRoot.appendChild headRoot
htmlRoot.appendChild bodyRoot

doc.appendChild htmlRoot

Dim fs As FileSystemObject
Dim sh
Dim tempFolder As String
Set fs = New FileSystemObject
Set sh = CreateObject("WScript.Shell")
tempFolder = fs.GetSpecialFolder(TemporaryFolder)

Dim fileName As String
fileName = tempFolder + "\preview.html"
doc.Save fileName
sh.Run fileName

Ответы [ 2 ]

1 голос
/ 29 июня 2010

Возможно, вместо того, чтобы пытаться хранить символы CSS, которые будут интерпретироваться как разметка XML, вы могли бы создать XHTML, используя существующий метод, но вместо вставки CSS с использованием MSXML, вставки заполнителя и замены после завершения сборкиXHTML.Примерно так:

style.appendChild doc.createTextNode("{css}")

' some more XHTML building here.

Dim html As String
Dim css As String

css = ".section>.title{font-weight: bold;}"
html = Replace(doc.Text, "{css}", css)

' Save the html here...

Таким образом, вы можете встраивать все, что захотите, в XHTL, не беспокоясь о том, что MSXML попытается избежать его за вас.

0 голосов
/ 29 июня 2010

escape-последовательность XML для> is> (имеется в виду GreaterThan)

...