Ruby 将Nokogiri::XML::文档强制转换为Nokogiri::HTML::文档

Ruby 将Nokogiri::XML::文档强制转换为Nokogiri::HTML::文档,ruby,casting,xml-serialization,html-parsing,nokogiri,Ruby,Casting,Xml Serialization,Html Parsing,Nokogiri,我想使用XSL将XML文档转换为HTML,稍加修改,然后呈现出来。这基本上就是我正在做的: source = Nokogiri::XML(File.read 'source.xml') xsl = Nokogiri::XSLT(File.read 'transform.xsl') transformed = xsl.transform(source) html = Nokogiri::HTML(transformed.to_html) html.title = 'Something comput

我想使用XSL将XML文档转换为HTML,稍加修改,然后呈现出来。这基本上就是我正在做的:

source = Nokogiri::XML(File.read 'source.xml')
xsl = Nokogiri::XSLT(File.read 'transform.xsl')
transformed = xsl.transform(source)
html = Nokogiri::HTML(transformed.to_html)
html.title = 'Something computed'
Stylesheet::transform
始终返回
XML::Document
,但我需要一个
HTML::Document
实例来使用类似
title=
的方法

上面的代码可以工作,但是导出和重新解析为HTML非常糟糕。因为目标是源的一个子类,所以必须有一种更有效的方法来执行转换

我该怎么收拾这乱七八糟的东西


作为一个附带问题,Nokogiri在处理doctype方面通常没有给我留下深刻的印象,不知道
HTML::Document
扩展了
XML::Document
,但是HTML文档中的单个节点只是普通的
XML::nodes
,即没有任何
HTML::nodes
。这提供了一种将XML文档转换为HTML的方法,方法是创建一个新的空
HTML::document
,并将其
root
设置为XML文档的根:

html = Nokogiri::HTML::Document.new
html.root= transformed.root

新文档具有可用的HTML方法,如
title=
meta\u encoding=
,序列化时,它会创建一个HTML文档而不是HTML:添加HTML doctype,正确使用空标记,如

,在适当的地方显示最小化的属性(例如
)而且不会在
块中转义
之类的内容。

因为
HTML::Document
XML::Document
的子类,所以看起来没有转换机制。但是,如果您查看HTML特定的方法,如
title
,它们通常只是选择器,如
title=at('title')和title.inner\u text
。不确定您还需要多少其他特定于HTML的方法。@总的来说,对于特定于HTML的方法,即使是这种可怕的强制转换形式也是值得的。我怀疑有一个HTML文档实例对于选择性地表示空元素(如
br
meta
)也更有帮助。我最初是用
css('head>title')
设置标题的,但我坚信如果有人已经写得很好,你就不应该再写了:)在Nokogiri中
title
或任何类似的HTML助手都没有什么特别之处,您自己无法在XML文档的上下文中安全地复制。或者,使用
Nokogiri::Slop(doc\u to\u parse)
Nokogiri::XML(doc\u to\u parse)。Slop并让它为您完成工作。@管理员谢谢,但是Slop decorator没有给我从
HTML::Document
中想要的东西。”。请记住,HTML不是XML,XHTML是XML,但HTML是基于SGML的,它允许在XHTML中使用

vs

等标记。奇怪的是,当使用XSLT和
元素进行转换时,Nokogiri似乎尊重这些差异。。。哦,我的头。再想想,既然HTML::Document是XML::Document的子类,那么您可以简单地使用
Nokogiri::HTML(File.read'source.XML')
开始第一行吗,即使此时它不是HTML?