/**
   * Transforms a list of KeywordBean object into its iso19139 representation.
   *
   * <pre>
   *  <gmd:MD_Keywords>
   *  	<gmd:keyword>
   *  		<gco:CharacterString>Keyword 1</gco:CharacterString>
   *  	</gmd:keyword>
   * 		<gmd:keyword>
   *  		<gco:CharacterString>Keyword 2</gco:CharacterString>
   *  	</gmd:keyword>
   *  	<gmd:type>
   *  		<gmd:MD_KeywordTypeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#MD_KeywordTypeCode" codeListValue="TYPE"/>
   *  	</gmd:type>
   *  	<gmd:thesaurusName>
   *  		<gmd:CI_Citation id="geonetwork.thesaurus.register.theme.bc44a748-f1a1-4775-9395-a4a6d8bb8df6">
   *  			<gmd:title>
   *  				<gco:CharacterString>THESAURUS NAME</gco:CharacterString>
   *  			</gmd:title>
   *  			<gmd:date gco:nilReason="unknown"/>
   * 			<gmd:otherCitationDetails>
   * 				<gmx:FileName src="http://localhost:8080/geonetwork/srv/eng/metadata.show?uuid=bc44a748-f1a1-4775-9395-a4a6d8bb8df6">register.theme.bc44a748-f1a1-4775-9395-a4a6d8bb8df6</gmx:FileName>
   * 			</gmd:otherCitationDetails>
   *  		</gmd:CI_Citation>
   *  	</gmd:thesaurusName>
   *  </gmd:MD_Keywords>
   *  </pre>
   *
   * @param kbList
   * @return a complex iso19139 representation of the keyword
   */
  public static Element getComplexIso19139Elt(List<KeywordBean> kbList) {
    Element root = new Element("MD_Keywords", NS_GMD);

    Element cs = new Element("CharacterString", NS_GCO);

    List<Element> keywords = new ArrayList<Element>();

    String thName = "";
    Element type = null;
    Element thesaurusName = null;

    for (KeywordBean kb : kbList) {
      Element keyword = new Element("keyword", NS_GMD);

      cs.setText(kb.getValue());
      keyword.addContent((Content) cs.clone());
      keywords.add((Element) keyword.detach());
      thName = kb.getThesaurus();
      if (type == null) type = KeywordBean.createKeywordTypeElt(kb);
      if (thesaurusName == null) thesaurusName = KeywordBean.createThesaurusNameElt(kb);
    }

    // Add elements to the root MD_Keywords element.
    root.addContent(keywords);
    root.addContent(type);
    root.addContent(thesaurusName);

    return root;
  }
  /**
   * Transforms a KeywordBean object into its iso19139 representation.
   *
   * <pre>
   * 		<gmd:keyword xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="">
   *   		<gco:CharacterString>A KEYWORD GENERATED BY XLINK SERVICE</gco:CharacterString>
   * 	</gmd:keyword>
   *  	<gmd:type>
   *  		<gmd:MD_KeywordTypeCode codeList="http://www.isotc211.org/2005/resources/codeList.xml#MD_KeywordTypeCode" codeListValue="TYPE"/>
   *  	</gmd:type>
   *  	<gmd:thesaurusName>
   *  		<gmd:CI_Citation "id="geonetwork.thesaurus.register.theme.bc44a748-f1a1-4775-9395-a4a6d8bb8df6">
   *  			<gmd:title>
   *  				<gco:CharacterString>THESAURUS NAME</gco:CharacterString>
   *  			</gmd:title>
   *  			<gmd:date gco:nilReason="unknown"/>
   * 			<gmd:otherCitationDetails>
   * 				<gmx:FileName src="http://localhost:8080/geonetwork/srv/eng/metadata.show?uuid=bc44a748-f1a1-4775-9395-a4a6d8bb8df6">register.theme.bc44a748-f1a1-4775-9395-a4a6d8bb8df6</gmx:FileName>
   * 			</gmd:otherCitationDetails>
   *  		</gmd:CI_Citation>
   *  	</gmd:thesaurusName>
   * </pre>
   *
   * @return an iso19139 representation of the keyword
   */
  public Element getIso19139() {
    Element ele = new Element("MD_Keywords", NS_GMD);
    Element el = new Element("keyword", NS_GMD);
    Element cs = new Element("CharacterString", NS_GCO);
    cs.setText(this.value);

    Element type = KeywordBean.createKeywordTypeElt(this);

    Element thesaurusName = KeywordBean.createThesaurusNameElt(this);

    el.addContent(cs);

    ele.addContent(el);
    ele.addContent(type);
    ele.addContent(thesaurusName);

    return ele;
  }
  /**
   * Creates keyword type element.
   *
   * @param kb
   * @return
   */
  private static Element createKeywordTypeElt(KeywordBean kb) {
    Element type = new Element("type", NS_GMD);
    Element keywordTypeCode = new Element("MD_KeywordTypeCode", NS_GMD);
    keywordTypeCode.setAttribute(
        "codeList", "http://www.isotc211.org/2005/resources/codeList.xml#MD_KeywordTypeCode");
    keywordTypeCode.setAttribute("codeListValue", kb.getType());
    type.addContent(keywordTypeCode);

    return type;
  }