Ruby 将Nokogiri::XML::文档强制转换为Nokogiri::HTML::文档
我想使用XSL将XML文档转换为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
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?