+static void
+write_variable_section (xmlTextWriter *writer, const struct variable *var, int id)
+{
+ xmlTextWriterStartElement (writer, _xml ("variable"));
+ write_attr (writer, "name", var_get_name (var));
+
+ bool is_string = var_get_type (var) == VAL_STRING;
+
+ int type = var_get_numeric_type_ (var);
+ xmlTextWriterWriteFormatAttribute (writer, _xml ("type"), "%d", type);
+
+ int max = is_string ? var_get_width (var) : 1;
+ xmlTextWriterWriteFormatAttribute (writer, _xml ("max"), "%d", max);
+
+ write_attr (writer, "maxtype", "3");
+
+ const char *label = var_get_label (var);
+ if (label)
+ {
+ xmlTextWriterStartElement (writer, _xml ("labels"));
+ write_attr (writer, "context", "LABEL");
+
+ xmlTextWriterStartElement (writer, _xml ("text"));
+ write_attr (writer, "context", "ANALYSIS");
+ write_xml_lang (writer);
+ xmlTextWriterWriteString (writer, _xml (label));
+ xmlTextWriterEndElement (writer);
+
+ xmlTextWriterEndElement (writer);
+ }
+
+ const struct val_labs *val_labs = var_get_value_labels (var);
+ size_t n_vls = val_labs_count (val_labs);
+ if (n_vls)
+ {
+ const struct val_lab **vls = val_labs_sorted (val_labs);
+
+ /* <categories/> */
+ xmlTextWriterStartElement (writer, _xml ("categories"));
+ write_global_name_space (writer);
+ int width = var_get_width (var);
+ for (size_t j = 0; j < n_vls; j++)
+ {
+ const struct val_lab *vl = vls[j];
+ const union value *value = val_lab_get_value (vl);
+
+ /* <category> */
+ xmlTextWriterStartElement (writer, _xml ("category"));
+ xmlTextWriterWriteFormatAttribute (writer, _xml ("id"), "_%d", id);
+
+ char *name = name_to_id (val_lab_get_label (vl));
+ write_attr (writer, "name", name);
+ free (name);
+
+ /* If the value here is missing, annotate it.
+
+ XXX only checking "user" here because not sure of correct other
+ cases. */
+ if (var_is_value_missing (var, value, MV_USER))
+ write_attr (writer, "missing", "user");
+ else if (var_is_value_missing (var, value, MV_SYSTEM))
+ write_attr (writer, "missing", "system");
+
+ /* <properties/> */
+ xmlTextWriterStartElement (writer, _xml ("properties"));
+ xmlTextWriterStartElement (writer, _xml ("property"));
+ write_attr (writer, "name", "Value");
+ write_value_label_value (writer, vl, width);
+ write_attr (writer, "type", "5");
+ write_attr (writer, "context", "Analysis");
+ xmlTextWriterEndElement (writer); /* </property> */
+ xmlTextWriterEndElement (writer); /* </properties> */
+
+ /* <labels/> */
+ xmlTextWriterStartElement (writer, _xml ("labels"));
+ write_attr (writer, "context", "LABEL");
+ xmlTextWriterStartElement (writer, _xml ("text"));
+ write_attr (writer, "context", "ANALYSIS");
+ write_xml_lang (writer);
+ xmlTextWriterWriteString (writer,
+ _xml (val_lab_get_label (vl)));
+ xmlTextWriterEndElement (writer); /* </text> */
+ xmlTextWriterEndElement (writer); /* </labels> */
+
+
+ /* </category> */
+ xmlTextWriterEndElement (writer);
+ }
+ write_empty_element (writer, "deleted");
+ xmlTextWriterEndElement (writer); /* </categories> */
+
+ free (vls);
+ }
+ /* </variable> */
+ xmlTextWriterEndElement (writer);
+}
+