2010-06-29 71 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

对于