【发布时间】:2011-10-19 00:46:37
【问题描述】:
我正在尝试从 XML 数据生成有效的 XHTML 文档。
我正在使用 MSXML 对象库,而不是 .NET。 使用 .NET 没有问题,转换很好。
我的 XSL 模板有这个:
<xsl:output
method="xml"
omit-xml-declaration="no"
indent="no"
version="1.0"
encoding="utf-8"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
/>
接着说:
<xsl:template match="/root">
<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>
</xsl:template>
问题来了。
-
如果我使用 MSXML2.DOMDocument40,MSXML 拒绝生成 XHTML,因为
此元素上的属性“{xmlns}”未在 DTD/Schema 中定义。
显然,模板正文中的其中一个 HTML 标记不允许具有它从
<html>继承的命名空间。但是 MSXML 不会告诉我是哪个标签。如果我只是从模板中删除所有内容并转储包含在
<p>中的 XML 数据,那么它转换得很好。显然,<p>被允许拥有xmlns。那是什么标签,它毁了我的一切?
-
如果我使用MSXML2.DOMDocument60,我首先要说:
xmlTransformedResult.setProperty("ProhibitDTD", False),否则我会得到“禁止 DTD”。
设置了该设置,我得到:
使用了元素“html”,但未在 DTD/Schema 中声明。
我该如何解决这个问题?
-
如果我使用 .NET 转换,一切都很好。生成的文档以
开头<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">
现在,我可以从模板中删除doctype-public 和doctype-system,只生成纯XML,然后手动为其添加标题。但我不想。完成这项工作的正确方法是什么?
【问题讨论】:
-
如何使用 MSXML 和脚本?您究竟使用哪个 API?如果您使用 transformToObject 并且 xmlTransformedResult 是一个 MSXML DOM 文档,那么在运行转换之前尝试设置
xmlTransformedResult.validateOnParse = false。 -
@Martin 是的。我使用来自 VB6 和 VBA 的
transformNodeToObject。validateOnParse确实有帮助,但那是正确的方法吗? (如果问题出在 MSXML 中,我会接受。否则,我更愿意修复我的代码。)
标签: xml xslt xhtml doctype msxml