我正在尝试从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,然后手动将标头添加到其中。但我不想。这项工作的正确方法是什么?
答案 0 :(得分:1)
我认为MSXML 6的问题在于它默认情况下既不允许DTD也不加载它们(或者通常是任何外部资源)。因此,为了避免验证消息,您需要设置两者(我使用的是JScript语法,请根据您选择的语言进行调整):
xmlTransformedResult.resolveExternals = true;
xmlTraansformedResult.setProperty('ProhibitDTD', false);
然后我认为你不会得到验证错误。至少只要W3C要提供XHTML DTD文件,我认为当您以编程方式执行此操作时,您可能会遇到错误但不依赖于MSXML,这只是一个W3C策略,可以避免过多的流量他们的服务器由每个人提取这样的DTD。