private static Element addLink(Element parent, Entry entry, Document doc) {
    Element link = doc.createElementNS(null, "link");
    parent.appendChild(link);

    link.setAttributeNS(null, "class", "- topic/link ");

    link.setAttributeNS(null, "href", entry.href);

    if (entry.scope != null) {
      link.setAttributeNS(null, "scope", entry.scope);
    }

    if (entry.format != null) {
      link.setAttributeNS(null, "format", entry.format);
    }

    if (entry.linktext != null) {
      Element linktext = (Element) doc.importNode(entry.linktext, /*deep*/ true);
      linktext.setAttributeNS(null, "class", "- topic/linktext ");
      link.appendChild(linktext);
    }

    if (entry.shortdesc != null) {
      Element desc = doc.createElementNS(null, "desc");
      desc.setAttributeNS(null, "class", "- topic/desc ");
      link.appendChild(desc);

      DOMUtil.copyChildren(entry.shortdesc, desc, doc);
    }

    return link;
  }
  private void processColumn(
      Element reltable,
      int column,
      LoadedDocuments loadedDocs,
      List<Entry> entryList,
      List<Entry[]> cellList) {
    Node child = reltable.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        Element childElement = (Element) child;

        if (DITAUtil.hasClass(childElement, "map/relrow")) {
          Element relcell = DOMUtil.getNthChildElement(childElement, column);
          if (relcell != null && DITAUtil.hasClass(relcell, "map/relcell")) {
            entryList.clear();
            processCell(relcell, loadedDocs, entryList);

            Entry[] entries = new Entry[entryList.size()];
            entryList.toArray(entries);
            cellList.add(entries);
          }
        }
      }

      child = child.getNextSibling();
    }
  }