【发布时间】:2013-02-16 18:01:26
【问题描述】:
我想使用 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 在处理 doctypes、不知道 <meta charset= 等方面通常让我印象深刻……有人知道具有类似功能的不那么自动魔法的库吗?
非常感谢;)
【问题讨论】:
-
由于
HTML::Document是XML::Document的子类,因此看起来没有转换机制。但是,如果您查看诸如title之类的HTML 特定方法,它们通常只是诸如title = at('title') and title.inner_text之类的选择器。不确定您需要多少其他 HTML 特定方法。 -
@GSP 总的来说,即使是这种可怕的强制转换形式对于 HTML 特定的方法也是值得的。我怀疑拥有一个 HTML 文档实例对于有选择地表示像
br和meta这样的空元素也更有帮助。我最初确实使用css('head > title')设置了标题,但我坚信如果有人已经写得很好,你不应该再写它:) -
在 Nokogiri 中,
title或任何类似的 HTML 助手确实没有什么特别之处,您无法在 XML 文档的上下文中安全地自行复制。或者,使用Nokogiri::Slop(doc_to_parse)或Nokogiri::XML(doc_to_parse).slop!并让它为您完成工作。 -
@theTinMan 谢谢,但是 Slop 装饰器并没有给我我想要的
HTML::Document的东西。请记住,HTML 不是 XML — XHTML 是,但 HTML 基于 SGML,它允许在 XHTML 中使用<br>与<br/>之类的标签。奇怪的是,在使用带有<xsl:output method="html"/>元素的 XSLT 进行转换时,Nokogiri 似乎尊重这些差异......哇,我的头。 -
再想一想,既然 HTML::Document 是 XML::Document 的子类,即使此时它不是 HTML,您是否可以简单地使用
Nokogiri::HTML(File.read 'source.xml')开始第一行?
标签: ruby casting xml-serialization html-parsing nokogiri