2010-02-24 30 views
11

Hola, creo una plantilla genérica para mostrar mi contenido. Pero el contenido puede ser ordenado en diferentes @ o nodos(). Así que quieren pasar el xRuta en.Usar variables en <xsl: sort select = "" />

<xsl:variable name="sort" select="@sortBy"/> 
<xsl:variable name="order" select="@order"/> 

<xsl:for-each select="Content[@type=$contentType]"> 
    <xsl:sort select="$sort" order="{$order}" data-type="text"/> 
    <xsl:sort select="@update" order="{$order}" data-type="text"/> 
    <xsl:copy-of select="."/> 
</xsl:for-each> 

Usando una variable para dejar en orden ascendente o descendente en los order="" obras.

¿Por qué no puedo hacer esto en el select=""?

Espero que esta superdinámica la variable de selección puede ser xPtah ya sea @publish o Title/node() o cualquier xPath.

No hay ningún error: simplemente ignora el género.

+0

La especificación W3c dice; xsl: sort tiene un atributo select cuyo valor es una expresión. y la expresión se retrasa como; Las expresiones aparecen como el valor de ciertos atributos en elementos definidos por XSLT y entre llaves $ Cuando agrego llaves, obtengo un error de compilación XSLT ...: { –

+0

Buena pregunta (+1). Ver la respuesta a continuación :) –

Respuesta

13

Esto es por diseño. El atributo select es el único que no acepta AVT (Atributo - Plantillas de valor).

La solución habitual es definir una variable con el nombre del elemento secundario que se debe utilizar como clave de clasificación. A continuación se muestra un pequeño ejemplo:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="vsortKey" select="'b'"/> 
<xsl:variable name="vsortOrder" select="'descending'"/> 

<xsl:template match="/*"> 
    <xsl:for-each select="*"> 
    <xsl:sort select="*[name() = $vsortKey]" order="{$vsortOrder}"/> 

    <xsl:copy-of select="."/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en el siguiente documento XML:

<t> 
    <a> 
    <b>2</b> 
    <c>4</c> 
    </a> 
    <a> 
    <b>5</b> 
    <c>6</c> 
    </a> 
    <a> 
    <b>1</b> 
    <c>7</c> 
    </a> 
</t> 

el resultado deseado se produce:

<a> 
    <b>5</b> 
    <c>6</c> 
    </a> 
<a> 
    <b>2</b> 
    <c>4</c> 
    </a> 
<a> 
    <b>1</b> 
    <c>7</c> 
</a> 
+0

Hmmm, sí, mira, probé esto ... excepto; Cosas es necesario ordenar por @attribute o child :: * –

0

El | (operador sindical) funciona ... Debo haberlo malinterpretado cuando lo intenté antes. ¡La respuesta de @Dimitre Novatchev me llevó por el camino correcto!

las siguientes obras:

<xsl:sort select="@*[name()=$sort] | *[name()=$sort]" 
      order="{$order}" data-type="text"/> 

Me permite ordenar por atributos y nodos. Obviamente, siempre y cuando no tengan el mismo name(), pero con valores diferentes.

+1

@Will: Please no publique en la sección inferior de la página a menos que esté publicando una respuesta real. StackOverflow no es como un foro clásico. Gracias. ;) – Tomalak

+0

No era ... estaba diciendo que este es el anser, lo siento un poco confundido. –

+0

@Will Hancock: Me alegro de que esta respuesta haya sido útil. Incluso puede considerar aceptarlo :) –

Cuestiones relacionadas