Información general del sistema de representación de vistas de listas XSLT

Última modificación: miércoles, 02 de febrero de 2011

Hace referencia a: SharePoint Foundation 2010

En este tema se ofrece una introducción al sistema de representación de vistas de lista de Microsoft SharePoint Foundation. Antes de leer el artículo, debería tener al menos una idea general de los conceptos de XSLT, incluidas las hojas de estilo, las plantillas, los parámetros, los árboles de nodo y el nodo de contexto.

Representación de hojas de estilo XSLT

Las hojas de estilo XSLT que se incluyen con SharePoint Foundation están ubicadas en archivos .xsl en %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL. Los dos archivos más importantes son vwsytles.xsl y fldtypes.xsl. El primero proporciona hojas de estilo para representar listas en el nivel de filas. El segundo proporciona hojas de estilo para representar ciertos campos (es decir, celdas) en las vistas de lista. En main.xsl se define un gran conjunto de variables XSLT globales.

Una hoja de estilo XSLT analiza un árbol de nodo de origen en algún lenguaje XML y produce un árbol de nodo de resultados en un lenguaje XML distinto. En los casos más simples, el árbol de origen se transforma en el árbol de resultados. Esto se realiza mediante plantillas XSLT, cada una de las cuales es un tipo de regla que determina la manera en que un fragmento específico del marcado de origen se transforma en un fragmento del resultado. Sin embargo, no es necesario que la transformación vuelva a expresar simplemente en el lenguaje de resultados toda (y solamente) la información del árbol de nodo de origen. Una transformación puede excluir información del árbol de origen e insertar información en el resultado que no proviene del origen. Concretamente, una plantilla XSLT puede combinar información de varios árboles de nodo de entrada. Cada nodo de entrada adicional, además del árbol de nodo de origen, se pasa a una plantilla como un parámetro. Las plantillas XSLT de representación de vistas de lista de SharePoint Foundation tienen dos árboles de nodo de entrada:

  • El árbol de nodo de origen es el marcado de Esquema View que define la vista actual de la lista. Este árbol es el que el procesador XSLT analiza y atraviesa a medida que crea el árbol de resultados. Por lo tanto, en cualquier momento durante la transformación XSLT, el nodo de contexto del procesador XSLT es un nodo de este marcado.

  • El árbol de parámetros thisNode se pasa a cada plantilla XSLT de representación de campos mediante la llamada a la plantilla. Este marcado contiene los datos reales de la lista. Cuando se representa un campo, el valor de campo real se obtiene de este parámetro. Para obtener una referencia completa del marcado del parámetro thisNode, vea XML dsQueryResponse.

Para obtener ejemplos de estos árboles de nodo, vea Ejemplos de árboles de nodos de resultados y de entrada en transformaciones XSLT.

Jerarquía de plantillas XSLT

La jerarquía de plantillas XSLT de SharePoint Foundation es algo compleja. La cadena de llamadas a plantillas (a través de xsl:apply-templates y xsl:call-template) cuando se representa una vista de lista varía en base a varios factores, incluido el tipo de lista, la vista de lista que se seleccionó, el estilo de vista y si la vista incluye o no la agrupación de filas, entro otros. En esta sección se describe la cadena de llamadas más simple posible en el caso directo cuando el usuario ha navegado a una página con una lista con las siguientes características.

  • La lista es de tipo 100 (genérica).

  • BaseViewID de la lista es 1.

  • La vista tiene el estilo de vista 0 (tabla básica).

  • No hay agrupación de filas.

El sistema de hojas de estilo XSLT se invoca mediante el evento PreRender de la página. La plantilla XSLT de nivel superior es la plantilla sin nombre declarada en vwsytles.xsl con la siguiente etiqueta inicial.

<xsl:template match="/">

El comportamiento de esta plantilla depende del resultado de algunas pruebas Boolean. Sin embargo, en el caso más directo, llama a xsl:apply-templates para las plantillas del modo RootTemplate y selecciona el nodo de contexto actual, que es la raíz del árbol de nodo de origen. (La variable XmlDefinition se define en main.xsl como ".", el contexto de nodo actual).

<xsl:apply-templates mode="RootTemplate" select="$XmlDefinition"/>

Esto aplica la plantilla View_Default_RootTemplate al elemento View, que es el elemento de documento; es decir, el elemento superior del árbol de nodo de origen. (Vea Ejemplos de árboles de nodos de resultados y de entrada en transformaciones XSLT para obtener un ejemplo). A continuación se detalla la etiqueta inicial de esta plantilla.

<xsl:template name="View_Default_RootTemplate" mode="RootTemplate" match="View" ddwrt:dvt_mode="root">

Esta plantilla construye el elemento HTML <table> que va a representar la lista. Llama a plantillas subsidiarias mediante las siguientes líneas.

<xsl:apply-templates select="." mode="full">
  <!-- child node omitted --> 
</xsl:apply-templates>

Estas líneas llaman a xsl:applytemplates para plantillas del modo completo y seleccionan el modo de contexto actual, que en este punto sigue siendo el elemento View. En el ejemplo de escenario de una vista estándar de una lista genérica, la única plantilla coincidente es la primera de la sección Plantillas de vista de vwsytles.xsl. Tiene la siguiente etiqueta inicial.

<xsl:template match="View" mode="full">

Esta plantilla comienza a representar algunos detalles de HTML de la lista. Lo más importante es que llama a otras plantillas mediante la siguiente línea.

<xsl:apply-templates select="." mode="RenderView" />

La única plantilla coincidente es la que tiene la siguiente etiqueta inicial.

<xsl:template match="View" mode="RenderView">

La llamada a esta plantilla sin nombre se diferencia de plantillas anteriores de la jerarquía en un aspecto clave. Las plantillas anteriores usaban solo el árbol de nodo de origen, que define la vista de lista, como fuente de información. Pero para rellenar la tabla HTML que va a representar la lista, se necesita información sobre esta lista en particular, como el número de elementos (filas) que tiene y los valores de los campos específicos de la lista. Según corresponda, esta plantilla se pasa al parámetro llamado thisNode, que contiene los datos de lista reales de la base de datos de contenido en forma de marcado dsQueryResponse. Cada llamada siguiente a la plantilla o a la aplicación de las plantillas de un modo en particular, pasa el mismo parámetro en las plantillas a las que se llamó. Para obtener un ejemplo del contenido de un parámetro thisNode, vea Ejemplos de árboles de nodos de resultados y de entrada en transformaciones XSLT.

La plantilla recorre en bucle todas las filas (elementos de lista) de thisNode. Para cada una, aplica plantillas con el modo Item y les pasa una referencia a todos los campos de la vista. A continuación se indican algunas de las líneas críticas.

<xsl:for-each select="$AllRows">
  <xsl:variable name="thisNode" select="."/>
  <!-- Matter omitted. The next lines run when the view does not include groups --> 
    <xsl:apply-templates mode="Item" select=".">
      <xsl:with-param name="Fields" select="$Fields"/>
      <!-- matter omitted -->
    </xsl:apply-templates>
  <!-- matter omitted -->
</xsl:for-each>

La variable AllRows es una referencia a los elementos Row de thisNode. Aunque parece que el nodo actual "." se asigna a thisNode con el atributo select, solo se trata en realidad de un valor predeterminado que tendría thisNode si no se pasara nada para él a la plantilla. De hecho, el marcado dsQueryResponse se pasa como un parámetro. Para cada fila de la lista, las plantillas con el modo Item se aplican y pasan al parámetro Fields. Esto último es una referencia a todos los elementos FieldRef en el árbol de nodo de origen.

Hay varias plantillas con el modo Item, pero solo una coincide con el caso en el que el tipo de lista es 100 (genérica) y el estilo de vista es 0. Es la primera plantilla de la sección Plantillas de fila de vwstyles.xsl. Tiene la siguiente etiqueta inicial.

<xsl:template mode="Item" match="Row">

Esta plantilla inserta las etiquetas HTML iniciales y finales <tr> que representan la fila de la tabla para el elemento de lista actual. Entre estas etiquetas, recorre en bucle todos los campos del elemento de lista y aplica a cada uno plantillas del modo printTbleCellEcbAllowed. A continuación se muestran las líneas críticas.

<tr>

  <!-- matter omitted -->

  <xsl:for-each select="$Fields">

      <!-- matter omitted -->

      <xsl:apply-templates select="." mode="printTableCellEcbAllowed">
        <xsl:with-param name="thisNode" select="$thisNode"/>
      </xsl:apply-templates>

      <!-- matter omitted -->

  </xsl:for-each>

  <!-- matter omitted -->

</tr>

La única plantilla coincidente tiene la siguiente etiqueta inicial.

<xsl:template name="FieldRef_printTableCell_EcbAllowed" match="FieldRef" 
                   mode="printTableCellEcbAllowed" ddwrt:dvt_mode="body">

Esta plantilla inserta las etiquetas HTML iniciales y finales <td> para formar la celda de la tabla para el campo actual. También asigna una clase de hojas de estilos en cascada (CSS) a la celda. Entre la etiqueta inicial y la etiqueta final, aplica plantillas del modo PrintFieldWithECB, como se muestra aquí.

<td>

  <!-- matter omitted -->

  <xsl:apply-templates select="." mode="PrintFieldWithECB">

  <!-- matter omitted -->

</td>

La plantilla coincidente relevante se encuentra en fldtypes.xsl, al igual que todo el resto de las plantillas de la jerarquía. Su etiqueta inicial se muestra en la parte superior del siguiente bloque de código. Esta plantilla y las restantes de la cadena representan celdas específicas en la tabla HTML, en función de si la fila actual es una fila de encabezado o una fila de datos, según el tipo de campo (como Nota o Divisa) y el tipo base del campo (como Texto o Número) y según el modo en que se debería representar el campo (por ejemplo, como texto sin formato o como un vínculo al formulario de presentación). A continuación se muestran las etiquetas iniciales para las plantillas restantes para un campo Texto en una fila de datos. Cada una recibe la llamada de su predecesora, ya sea por nombre o como resultado de una aplicación de plantillas de un modo en particular.

<xsl:template name="FieldRef_NoMenu_PrintFieldWithECB" ddwrt:ECB="Menu" 
              match="FieldRef" mode="PrintFieldWithECB" ddwrt:ghost="always">

<xsl:template name="FieldRef_Ecb_PrintFieldWithDisplayFormLink" 
              ddwrt:ECB="Link" match="FieldRef[@LinkToItem]" 
              mode="PrintFieldWithDisplayFormLink" ddwrt:ghost="always">

<xsl:template name="FieldRef_PrintField" match="FieldRef" mode="PrintField" 
              ddwrt:dvt_mode="body" ddwrt:ghost="always">

<xsl:template name="PrintField" ddwrt:dvt_mode="body" ddwrt:ghost="always">

<xsl:template name="FieldRef_Text_body" ddwrt:dvt_mode="body" match ="FieldRef" 
              mode="Text_body">

La última es la plantilla que finalmente representa el valor de un campo Texto en la celda de la tabla HTML. A continuación se muestra el marcado completo para esta plantilla.

<xsl:template name="FieldRef_Text_body" ddwrt:dvt_mode="body" match ="FieldRef" 
              mode="Text_body">
  <xsl:param name="thisNode" select="."/>
  <xsl:choose>
    <xsl:when test="@AutoHyperLink='TRUE'">
      <xsl:value-of select="$thisNode/@*[name()=current()/@Name]" 
                    disable-output-escaping ="yes"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$thisNode/@*[name()=current()/@Name]"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Tenga en cuenta que la plantilla crea una bifurcación en función de si se define el campo para que dé formato automáticamente a las cadenas que parecen direcciones URL como vínculos HTML <a>. Si está definido, cuando el procesador XSLT represente el HTML para el campo, no reemplazará caracteres importantes, como "<" y "&", por su entidad de caracteres equivalente (&lt; y &amp;), lo cual haría normalmente, de manera predeterminada, un procesador XSLT compatible. Dejando de lado esta complicación, la plantilla simplemente emite el valor del campo con la siguiente línea.

<xsl:value-of select="$thisNode/@*[name()=current()/@Name]"/>

Para obtener una descripción detallada sobre esta línea, vea Procedimiento para personalizar la representación de un campo en una vista de lista.

Vea también

Conceptos

Ejemplos de árboles de nodos de resultados y de entrada en transformaciones XSLT

Otros recursos

Vistas de lista