XSL - >在模板中设置了doctype的XHTML,不会转换

时间:2011-08-03 11:19:57

标签: xml xslt xhtml doctype msxml

我正在尝试从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-publicdoctype-system,只生成普通的XML,然后手动将标头添加到其中。但我不想。这项工作的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为MSXML 6的问题在于它默认情况下既不允许DTD也不加载它们(或者通常是任何外部资源)。因此,为了避免验证消息,您需要设置两者(我使用的是JScript语法,请根据您选择的语言进行调整):

xmlTransformedResult.resolveExternals = true;
xmlTraansformedResult.setProperty('ProhibitDTD', false);

然后我认为你不会得到验证错误。至少只要W3C要提供XHTML DTD文件,我认为当您以编程方式执行此操作时,您可能会遇到错误但不依赖于MSXML,这只是一个W3C策略,可以避免过多的流量他们的服务器由每个人提取这样的DTD。