【问题标题】:Cast a Nokogiri::XML::Document to a Nokogiri::HTML::DocumentCast a Nokogiri::XML::Document to a Nokogiri::HTML::Document
【发布时间】: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::DocumentXML::Document 的子类,因此看起来没有转换机制。但是,如果您查看诸如title 之类的HTML 特定方法,它们通常只是诸如title = at('title') and title.inner_text 之类的选择器。不确定您需要多少其他 HTML 特定方法。
  • @GSP 总的来说,即使是这种可怕的强制转换形式对于 HTML 特定的方法也是值得的。我怀疑拥有一个 HTML 文档实例对于有选择地表示像 brmeta 这样的空元素也更有帮助。我最初确实使用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


【解决方案1】:

HTML::Document 扩展了 XML::Document,但 HTML 文档中的各个节点只是普通的 XML::Nodes,即没有任何 HTML::Nodes。这提出了一种将 XML 文档转换为 HTML 的方法,方法是创建一个新的空 HTML::Document 并将其 root 设置为 XML 文档的root

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

新文档具有title=meta_encoding= 等HTML 方法可用,并且在序列化时创建HTML 文档而不是HTML:添加HTML 文档类型,正确使用<br> 等空标签,显示最小化的属性,其中适当的(例如<input type="checkbox" selected>)并且不会在<script> 块中转义> 之类的东西。

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2017-05-07
    • 2022-12-28
    • 1970-01-01
    相关资源
    最近更新 更多