2010-06-29 2 views
0

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

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

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

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

EDIT: Вот блок кода, который воспроизводит это поведение. Поместите его в 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 

ответ

1

Возможно, вместо того, чтобы пытаться сохранить символы 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

Не совсем применимо, я строю документ XHTML напрямую, а не используя XSLT. –

+0

@Matt S: Я обновил свой ответ. – Mike

+1

Это сработало. Теперь я могу продолжить работу над этой мерзостью. –

0

Последовательность побег XML для > является & Гт (что означает GreaterThan)

+0

Проблема заключается в том, что MSXML заменяет '>' на '>', который затем не является неизолированным, разбивая CSS. Помещение '>' в CSS дает '& >' в результирующем файле. –

+0

Для тега