# File lib/nanoc/filters/relativize_paths.rb, line 72
    def nokogiri_process(content, selectors, namespaces, klass, type)
      # Ensure that all prefixes are strings
      namespaces = namespaces.inject({}) { |new, (prefix, uri)| new.merge(prefix.to_s => uri) }

      doc = content =~ /<html[\s>]/ ? klass.parse(content) : klass.fragment(content)
      selectors.map { |sel| "descendant-or-self::#{sel}" }.each do |selector|
        doc.xpath(selector, namespaces).each do |node|
          if node.name == 'comment'
            content = node.content.dup
            content = content.sub(%r{^(\s*\[.+?\]>\s*)(.+?)(\s*<!\[endif\])}m) do |m|
              fragment = nokogiri_process($2, selectors, namespaces, klass, type)
              $1 + fragment + $3
            end
            comment = Nokogiri::XML::Comment.new(doc, content)
            # Works w/ Nokogiri 1.5.5 but fails w/ Nokogiri 1.5.2
            node.replace(comment)
          elsif self.path_is_relativizable?(node.content)
            node.content = relative_path_to(node.content)
          end
        end
      end
      result = doc.send("to_#{type}")

      # FIXME cleanup because it is ugly
      # # Because using the `Nokogiri::XML::DocumentFragment` class DOCTYPE 
      # pseudonodes becomes even more creepy than usual.
      result.sub!(/(!DOCTYPE.+?)(&gt;)/, '<\1>')

      result
    end