使用Nokogiri调整IE条件注释而不转换实体

时间:2012-07-03 16:37:57

标签: ruby xml xhtml nokogiri conditional-comments

我的头部有一个HTML5 Shiv的XHTML文件:

<!--[if lt IE 9]>
  <script src='../common/html5.js' type='text/javascript'></script>
<![endif]-->

使用Nokogiri我需要调整该评论中的路径,剥离../。但是,对注释节点.content的任何更改都会产生XML输出,将><转换为实体:

XML = <<ENDXML
<r><!--[if lt IE 9]>
  <script src='../common/html5.js' type='text/javascript'></script>
<![endif]--></r>
ENDXML

require 'nokogiri'
doc = Nokogiri.XML(XML)
comment = doc.at_xpath('//comment()')
comment.content = comment.content.sub('../','')
puts comment.to_xml
#=> <!--[if lt IE 9]&gt;
#=>   &lt;script src='common/html5.js' type='text/javascript'&gt;&lt;/script&gt;
#=> &lt;![endif]-->

原始来源是有效的XML / XHTML。在调整过程中,如何让Nokogiri不转换此注释中的实体?

1 个答案:

答案 0 :(得分:3)

Nokogiri docs for content=说:

  

字符串获取XML转义,而不是解释为标记。

因此,您可以使用replace和明确创建的comment node替换节点,而不是使用它:

XML = <<ENDXML
<r><!--[if lt IE 9]>
  <script src='../common/html5.js' type='text/javascript'></script>
<![endif]--></r>
ENDXML

require 'nokogiri'
doc = Nokogiri.XML(XML)
comment = doc.at_xpath('//comment()')

# this line is the new one, replacing comment.content= ...
comment.replace Nokogiri::XML::Comment.new(doc, comment.content.sub('../',''))

# note `comment` is the old comment, so to see the changes
# look at the whole document
puts doc.to_xml

输出是:

<?xml version="1.0"?>
<r>
  <!--[if lt IE 9]>
  <script src='common/html5.js' type='text/javascript'></script>
<![endif]-->
</r>