Plantilla principal para el ejemplo avanzado xsl:for-each
Como esta hoja de estilo XSLT genera tablas con básicamente la misma estructura que el ejemplo sencillo <xsl:for-each>, la plantilla principal es similar a la que se utilizó en el ejemplo sencillo.
<?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>
<xsl:for-each select="//oms:pivotTable[@subType='Frequencies']">
<xsl:for-each select="oms:dimension[@axis='row']">
<h3>
<xsl:call-template name="showVarInfo"/>
</h3>
</xsl:for-each>
<!--create the HTML table-->
<table border="1">
<tbody align="char" char="." charoff="1">
<tr> <th>Category</th><th>Count</th><th>Percent</th>
</tr>
<xsl:for-each select="descendant::oms:dimension[@axis='column']">
<xsl:if test="oms:category[3]">
<tr>
<td>
<xsl:choose>
<xsl:when test="parent::*/@varName">
<xsl:call-template name="showValueInfo"/>
</xsl:when>
<xsl:when test="not(parent::*/@varName)">
<b><xsl:value-of select="parent::*/@text"/></b>
</xsl:when>
</xsl:choose>
</td>
<td>
<xsl:apply-templates select="oms:category[1]/oms:cell/@number"/>
</td>
<td>
<xsl:apply-templates select="oms:category[3]/oms:cell/@number"/>
</td>
</tr>
</xsl:if>
</xsl:for-each>
</tbody>
</table>
<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>
Esta plantilla es muy similar a la del ejemplo anterior. Las principales diferencias son las siguientes:
<xsl:call-template name="showVarInfo"/>llama a otra plantilla para determinar qué mostrar para el título de tabla en lugar de simplemente utilizar el atributotextde la dimensión de fila (oms:dimension[@axis='row']). Consulte el tema Control de la visualización de variables y etiquetas de valor para obtener más información.<xsl:if test="oms:category[3]">selecciona únicamente los datos de la sección 'Valid' de la tabla, en vez de<xsl:if test="ancestor::oms:group[@text='Valid']">. El argumento de posición que se utiliza en este ejemplo no depende de ningún texto localizado. Se basa en que la estructura básica de una tabla de frecuencias siempre es la misma y en que el OXML no incluye elementos para las casillas vacías. Ya que la sección 'Missing' de una tabla de frecuencias sólo contiene valores en las primeras dos columnas, no hay ningún elemento de columnaoms:category[3]en la sección 'Missing'; de manera que la condición de prueba no se cumple para las filas 'Missing'. Consulte el tema Expresiones XPath en varios entornos de lenguaje para obtener más información.<xsl:when test="parent::*/@varName">selecciona las filas no totales en lugar de<xsl:when test="not((parent::*)[@text='Total'])">. Los elementos de columna de las filas que no son totales de una tabla de frecuencias contienen un atributovarNameque identifica la variable, mientras que no ocurre así con los elementos de columna de las filas que son totales. Por tanto, esto selecciona las filas que no son totales sin depender de ningún texto localizado.<xsl:call-template name="showValueInfo"/>llama a otra plantilla para determinar lo que se mostrará para las etiquetas de fila en vez de<xsl:value-of select="parent::*/@text"/>. Consulte el tema Control de la visualización de variables y etiquetas de valor para obtener más información.<xsl:apply-templates select="oms:category[1]/oms:cell/@number"/>selecciona el valor de la columna 'Frecuencia' en vez de<xsl:value-of select="oms:category[@text='Frequency']/oms:cell/@text"/>. Se utiliza un argumento de posición en vez de texto localizado (la columna 'Frecuencia' siempre es la primera columna de una tabla de frecuencias) y se aplica una plantilla para determinar cómo se muestra el valor en la casilla. Los valores porcentuales se tratan de la misma manera, utilizandooms:category[3]para seleccionar los valores de la columna 'Porcentaje válido'. Consulte el tema Control de la visualización decimal para obtener más información.