2010-06-29 149 views
0

我有一個Excel工作簿,用作在我們的內部系統中生成用戶可填寫表單的起點。作爲創建這些工作簿的用戶的助手,我試圖添加一個預覽功能,使用該電子表格,執行一些VBA魔術來生成HTML文件,然後在瀏覽器中顯示該功能。MSXML XHTML和嵌入式CSS

我已經完成了基本的結構,使用MSXML寫出XHTML,到目前爲止,這麼好。現在,我遇到了嵌入樣式表的問題。

樣式表包含在VBA代碼中的字符串中,我試圖將它添加到標頭中的<style>標記中,這很簡單。我遇到問題的地方是我在樣式表中使用了CSS選擇器,>會導致我遇到問題,因爲MSXML想將它編碼爲XML轉義序列,從而破壞CSS。我試過在CDATA塊中添加樣式表,但是瀏覽器只是忽略它。

tl; dr:如何將包含>的樣式表嵌入到使用MSXML生成的HTML文件中?

編輯:這裏是一段代碼,再現這種行爲。放入在Excel或所選的VBA的使用程序的Sub,運行它,並查看源:

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

也許不是試圖存儲將被解釋爲XML標記的CSS字符,而是可以使用現有方法生成XHTML,但不是使用MSXML插入CSS,而是插入佔位符並替換它在完成構建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。 – 2010-06-29 18:12:51

+0

@Matt S:我已經更新了我的答案。 – Mike 2010-06-29 18:53:20

+1

工作。現在我可以繼續研究這種可憎的事了。 – 2010-06-29 19:01:28

0

爲 > 的XML換碼序列是& GT; (意思是GreaterThan)

+0

問題是MSXML正在用'>'替換'>',然後這個''不會被轉義,打破了CSS。將'>'放在CSS中會在結果文件中產生'& >'。 – 2010-06-29 17:58:41

+0

對於