# File lib/asciidoctor/converter/docbook5.rb, line 387
    def table node
      has_body = false
      result = []
      pgwide_attribute = (node.option? 'pgwide') ? ' pgwide="1"' : nil
      result << %(<#{tag_name = node.title? ? 'table' : 'informaltable'}#{common_attributes node.id, node.role, node.reftext}#{pgwide_attribute} frame="#{node.attr 'frame', 'all'}" rowsep="#{['none', 'cols'].include?(node.attr 'grid') ? 0 : 1}" colsep="#{['none', 'rows'].include?(node.attr 'grid') ? 0 : 1}">)
      if (node.option? 'unbreakable')
        result << '<?dbfo keep-together="always"?>'
      elsif (node.option? 'breakable')
        result << '<?dbfo keep-together="auto"?>'
      end
      result << %(<title>#{node.title}</title>) if tag_name == 'table'
      col_width_key = if (width = (node.attr? 'width') ? (node.attr 'width') : nil)
        TABLE_PI_NAMES.each do |pi_name|
          result << %(<?#{pi_name} table-width="#{width}"?>)
        end
        'colabswidth'
      else
        'colpcwidth'
      end
      result << %(<tgroup cols="#{node.attr 'colcount'}">)
      node.columns.each do |col|
        result << %(<colspec colname="col_#{col.attr 'colnumber'}" colwidth="#{col.attr col_width_key}*"/>)
      end
      TABLE_SECTIONS.select {|tblsec| !node.rows[tblsec].empty? }.each do |tblsec|
        has_body = true if tblsec == :body
        result << %(<t#{tblsec}>)
        node.rows[tblsec].each do |row|
          result << '<row>'
          row.each do |cell|
            halign_attribute = (cell.attr? 'halign') ? %( align="#{cell.attr 'halign'}") : nil
            valign_attribute = (cell.attr? 'valign') ? %( valign="#{cell.attr 'valign'}") : nil
            colspan_attribute = cell.colspan ? %( namest="col_#{colnum = cell.column.attr 'colnumber'}" nameend="col_#{colnum + cell.colspan - 1}") : nil
            rowspan_attribute = cell.rowspan ? %( morerows="#{cell.rowspan - 1}") : nil
            # NOTE <entry> may not have whitespace (e.g., line breaks) as a direct descendant according to DocBook rules
            entry_start = %(<entry#{halign_attribute}#{valign_attribute}#{colspan_attribute}#{rowspan_attribute}>)
            cell_content = if tblsec == :head
              cell.text
            else
              case cell.style
              when :asciidoc
                cell.content
              when :verse
                %(<literallayout>#{cell.text}</literallayout>)
              when :literal
                %(<literallayout class="monospaced">#{cell.text}</literallayout>)
              when :header
                cell.content.map {|text| %(<simpara><emphasis role="strong">#{text}</emphasis></simpara>) }.join
              else
                cell.content.map {|text| %(<simpara>#{text}</simpara>) }.join
              end
            end
            entry_end = (node.document.attr? 'cellbgcolor') ? %(<?dbfo bgcolor="#{node.document.attr 'cellbgcolor'}"?></entry>) : '</entry>'
            result << %(#{entry_start}#{cell_content}#{entry_end})
          end
          result << '</row>'
        end
        result << %(</t#{tblsec}>)
      end
      result << '</tgroup>'
      result << %(</#{tag_name}>)

      warn 'asciidoctor: WARNING: tables must have at least one body row' unless has_body
      result * EOL
    end