Einfaches "Pull"-Beispiel mit "xsl:for-each"

In diesem Beispiel wird <xsl:for-each> verwendet, um durch "Pull" ausgewählte Informationen aus der OXML-Ausgabe zu entnehmen und benutzerdefinierte HTML-Tabellen zu erstellen.

Sie können zwar mithilfe von DESTINATION FORMAT=HTML im Befehl OMS problemlos HTML-Ausgaben erstellen, Sie haben jedoch über die speziellen Objekttypen, die in der HTML-Datei enthalten sind, hinaus nur wenig Steuerungsmöglichkeiten für den erstellten HTML-Code. Mit OXML dahingegen können Sie benutzerdefinierte Tabellen erstellen. In diesem Beispiel geschieht Folgendes:

  • Es werden nur Häufigkeitstabellen in der OXML-Datei ausgewählt.
  • Es werden nur gültige (nicht fehlende) Werte angezeigt.
  • Es werden nur die Spalten Häufigkeit und Gültige Prozente angezeigt.
  • Die Standardspaltenbeschriftungen werden durch Anzahl und Prozent ersetzt.

Das in diesem Beispiel verwendete XSLT-Style-Sheet ist oms_simple_frequency_tables.xsl.

Hinweis:Dieses Style-Sheet ist nicht für die Arbeit mit Häufigkeitstabellen konzipiert, die mit der Verarbeitung von geschichteten aufgeteilten Dateiengeneriert wurden.

Abb. 1. XSLT-Style-Sheet: oms_simple_frequency_tables.xsl
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0" xmlns:oms="http://xml.spss.com/spss/oms">
<!--enclose everything in a template, starting at the root node-->
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>Modified Frequency Tables</TITLE>
</HEAD>
<BODY>
<!--Find all Frequency Tables-->
<xsl:for-each select="//oms:pivotTable[@subType='Frequencies']">
<xsl:for-each select="oms:dimension[@axis='row']">
 <h3>
  <xsl:value-of select="@text"/>
 </h3>
</xsl:for-each>
<!--create the HTML table-->
<table border="1">
 <tbody align="char" char="." charoff="1">
 <tr>
  <!--
  table header row; you could extract headings from 
  the XML but in this example we're using different header text
  -->
  <th>Category</th><th>Count</th><th>Percent</th>
 </tr>
 <!--find the columns of the pivot table-->
 <xsl:for-each select="descendant::oms:dimension[@axis='column']">
   <!--select only valid, skip missing-->
    <xsl:if test="ancestor::oms:group[@text='Valid']">
     <tr>
     <td>
       <xsl:choose>
        <xsl:when test="not((parent::*)[@text='Total'])">
         <xsl:value-of select="parent::*/@text"/>
        </xsl:when>
        <xsl:when test="((parent::*)[@text='Total'])">
         <b><xsl:value-of select="parent::*/@text"/></b>
        </xsl:when>
       </xsl:choose>
     </td>
     <td>
      <xsl:value-of select="oms:category[@text='Frequency']/oms:cell/@text"/>      
     </td>
     <td>
      <xsl:value-of select="oms:category[@text='Valid Percent']/oms:cell/@text"/>
     </td>
    </tr>
  </xsl:if>
  </xsl:for-each>
 </tbody>
</table>
<!--Don't forget possible footnotes for split files-->
<xsl:if test="descendant::*/oms:note">
<p><xsl:value-of select="descendant::*/oms:note/@text"/></p>
</xsl:if>
</xsl:for-each>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
  • xmlns:oms="http://xml.spss.com/spss/oms" definiert "oms" als Präfix, das den Namespace identifiziert. Daher muss in allen Elementnamen in XPath-Ausdrücken das Präfix "oms:" enthalten sein.
  • Der XSLT-Code besteht in erster Linie aus einer Reihe von verschachtelten <xsl:for-each>-Anweisungen, von denen jede einen Drill nach unten zu einem anderen Element und Attribut der Tabelle durchführt.
  • Mit <xsl:for-each select="//oms:pivotTable[@subType='Frequencies']"> werden alle Tabellen des Untertyps 'Häufigkeiten' ausgewählt.
  • Mit <xsl:for-each select="oms:dimension[@axis='row']"> wird die Zeilendimension der einzelnen Tabellen ausgewählt.
  • <xsl:for-each select="descendant::oms:dimension[@axis='column']"> wählt die Spaltenelemente aus jeder Zeile aus. OXML stellt die Tabellen Zeile für Zeile dar, sodass die Spaltenelemente in den Zeilenelementen verschachtelt sind.
  • Mit <xsl:if test="ancestor::oms:group[@text='Valid']"> wird nur der Bereich der Tabelle ausgewählt, der gültige nicht fehlende Werte enthält. Wenn in der Tabelle keine fehlenden Werte verzeichnet sind, wird die gesamte Tabelle aufgenommen. Dies ist die erste einer Reihe von XSLT-Spezifikationen in diesem Beispiel, die auf Attributwerten beruhen, die sich für verschiedene Ausgabesprachen voneinander unterscheiden. Wenn Sie keine Lösungen benötigen, die mit mehreren Ausgabesprachen funktionieren, ist dies häufig die einfachste, direkteste Methode für die Auswahl bestimmter Elemente. Oftmals gibt es jedoch Alternativen, die nicht auf lokalisierten Textzeichenfolgen beruhen. Weitere Informationen finden Sie im Thema Erweitertes xsl:for-each "Pull" -Beispiel .
  • Mit <xsl:when test="not((parent::*)[@text='Total'])"> werden Spaltenelemente ausgewählt, die sich nicht in der Zeile 'Gesamt' befinden. Auch hier beruht die Auswahl auf lokalisiertem Text und der einzige Grund, aus dem wir in diesem Beispiel die Unterscheidung zwischen der Zeile mit den Gesamtwerten und den anderen Zeilen vornehmen, ist, dass die Zeilenbeschriftung 'Gesamt' fett formatiert werden soll.
  • Mit <xsl:value-of select="oms:category[@text='Frequency']/oms:cell/@text"/> wird der Inhalt der Zelle in der Spalte 'Häufigkeit' für die einzelnen Zeilen abgerufen.
  • <xsl:value-of select="oms:category[@text='Valid Percent']/oms:cell/@text"/> ruft den Inhalt der Zelle in der Spalte 'Gültige Prozent' jeder Zeile ab. Sowohl dieser Code als auch der vorhergehende Code zum Abrufen des Werts aus der Spalte 'Häufigkeit' beruhen auf lokalisiertem Text.