SPSS Viewer Format
==================

SPSS Viewer or .spv files, here called SPV files, are written by SPSS 16 and later to represent the contents of its output editor. This section documents the format.  This description is detailed enough to read SPV files, but it is probably not sufficient to write them.

An an aside, SPSS 15 and earlier versions use a completely different output format based on the Microsoft Compound Document Format.  This format is not documented.

An SPV file is a Zip archive that can be read with zipinfo and unzip and similar programs.  The final member in the Zip archive is a file named META-INF/MANIFEST.MF.  This structure makes SPV files resemble Java ``JAR'' files, but whereas a JAR manifest contains a sequence of colon-delimited key/value pairs, an SPV manifest contains the string allowPivoting=true, without a new-line.

The rest of the members in an SPV file's Zip archive fall into two categories: structure and details.  ``Structure'' member names begin with outputViewerNNNNNNNNNN, where each N is a decimal digit, and end with .xml, and often include the string _heading in between.  Each of these members represents some kind of output item (a table, a heading, a block of text, etc.) or a group of them.  The member whose output goes at the beginning of the document is numbered 0, the next member in the output is numbered 1, and so on.

Structure members contain XML.  This XML is sometimes self-contained, but it often references other members in the Zip archive named as follows:

PREFIX_table.xml and PREFIX_tableData.bin
PREFIX_lightTableData.bin
     The structure of a table plus its data.  Older SPV files pair a PREFIX_table.xml file that describes the table's structure with a binary PREFIX_tableData.bin file that gives its data.  Newer SPV files (the majority of those in the corpus) instead include a single PREFIX_lightTableData.bin file that incorporates both into a single binary format.

PREFIX_warning.xml and PREFIX_warningData.bin
PREFIX_lightWarningData.bin
     Same format used for tables, with a different name.

PREFIX_notes.xml and PREFIX_notesData.bin
PREFIX_lightNotesData.bin
     Same format used for tables, with a different name.

PREFIX_chartData.bin and PREFIX_chart.xml
     The structure of a chart plus its data.  Charts do not have a ``light'' format.

PREFIX_model.xml
PREFIX_pmml.xml
PREFIX_stats.xml
     Not yet investigated.  The corpus contains only one example of each.

The PREFIX in the names of the detail members is typically an 11-digit decimal number that increases for each item, tending to skip values.  Older SPV files use different naming conventions.  Structure member refer to detail members by name, and so their exact names do not appear to matter as long as they are unique.

Structure Member Format
-----------------------

Structure members XML files claim conformance with a collection of XML Schemas.  These schemas are distributed, under a nonfree license, with SPSS binaries.  Fortunately, the schemas are not necessary to understand the structure members.  To a degree, the schemas can even be deceptive because they document elements and attributes that are not in the corpus and lack documentation of elements and attributes that are commonly found in the corpus.

Structure members use a different XML namespace for each schema, but these namespaces are not entirely consistent: in some SPV files, for example, the viewer-tree schema is associated with namespace http://xml.spss.com/spss/viewer-tree and in other with http://xml.spss.com/spss/viewer/viewer-tree (note the additional viewer/ directory.  In any case, the schema URIs are not resolvable to obtain the schemas themselves.

One may ignore all of the above in interpreting a structure member. The actual XML has a simple and straightforward form that does not require a reader to take schemas or namespaces into account.

heading
     Parent: Document root or heading

     Contents: label [container | heading]*

     The root of a structure member is a heading, which represents a section of output beginning with a title (the label) and ordinarily followed by a container for content and possibly further nested (sub)-sections of output.

     The following attributes have been observed on both document root and nested heading elements:

     Optional attribute: creator-version
          The version of the software that created this SPV file.  A string of the form xxyyzzww represents software version xx.yy.zz.ww, e.g. 21000001 is version 21.0.0.1.  Trailing pairs of zeros are sometimes omitted, so that 21, 210000, and 21000000 are all version 21.0.0.0 (and the corpus contains all three of those forms).

     The following attributes have been observed on document root heading elements only:

     Optional attribute: creator
          The directory of the software that created this SPV file, e.g. C:\PROGRA~1\IBM\SPSS\STATIS~1\22 or /Applications/IBM/SPSS/Statistics/22/SPSSStatistics.app/Contents/Resources/Java/../../bin.

     Optional attribute: creation-date-time
          The date and time at which the SPV file was written, in a locale-specific format, e.g. Friday, May 16, 2014 6:47:37 PM PDT or lunedì 17 marzo 2014 3.15.48 CET or even Friday, December 5, 2014 5:00:19 o'clock PM EST.

     Optional attribute: lockReader
          Whether a reader should be allowed to edit the output.  The possible values are true and false, but the corpus only contains false.

     Optional attribute: schemaLocation
          This is actually an XML Namespace attribute.  A reader may ignore it.

     The following attributes have been observed only on nested heading elements:

     Required attribute: commandName
          The locale-invariant name of the command that produced the output, e.g. Frequencies, T-Test, Non Par Corr.

     Optional attribute: visibility
          To what degree the output represented by the element is visible.  The only observed value is collapsed.

     Optional attribute: locale
          The locale used for output, in Windows format, which is similar to the format used in Unix with the underscore replaced by a hyphen, e.g. en-US, en-GB, el-GR, sr-Cryl-RS.

     Optional attribute: olang
          The output language, e.g. en, it, es, de, pt-BR.

label
     Parent: heading or container

     Contents: text

     Every heading and container holds a label as its first child.  The root heading in a structure member always contains the string ``Output''.  Otherwise, the text in label describes what it labels, often by naming the statistical procedure that was executed, e.g. ``Frequencies'' or ``T-Test''.  Labels are often very generic, especially within a container, e.g. ``Title'' or ``Warnings'' or ``Notes''.  Label text is localized according to the output language, e.g. in Italian a frequency table procedure is labeled ``Frequenze''.

     The corpus contains one example of an empty label, one that contains no text.

container
     Parent: heading

     Contents: label [table | text]

     A container serves to label a table or a text item.

     Required attribute: visibility
          Either visible or hidden, this indicates whether the container's content is displayed.

     Optional attribute: text-align
          Presumably indicates the alignment of text within the container.  The only observed value is left.  Observed with nested table and text elements.

     Optional attribute: width
          The width of the container in the form Npx, e.g. 1097px.

text
     Parent: container

     Contents: html

     Required attribute: type
          One of title, log, or text.

     Optional attribute: commandName
          As on the heading element.  For output not specific to a command, this is simply log.  The corpus contains one example of where commandName is present but set to the empty string.

     Optional attribute: creator-version
          As on the heading element.

html
     Parent: text

     Contents: cdata

table
     Parent: container

     Contents: tableStructure

tableStructure
     Parent: table Contents: dataPath

dataPath
     Parent: tableStructure Contents: text