2010-02-24 12 views
11

Ciao sto costruendo un modello generico per elencare il mio contenuto. Ma il contenuto può essere ordinato su diversi @ 's o node()' s. Così vuole passare il xPath in.Utilizzo di variabili in <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> 

Utilizzando una variabile a cadere in ordine crescente o decrescente nelle order="" OPERE.

Perché non è possibile farlo su select=""?

Spero di rendere questa super dinamica la variabile select può essere xPtah o @publish o Title/node() o qualsiasi xPath.

Nessun errore. Ignora semplicemente l'ordinamento.

+0

specifica W3c; xsl: sort ha un attributo select il cui valore è un'espressione. e l'espressione è delared come; Espressioni si verificano come il valore di determinate qualità su elementi XSLT definiti e tra parentesi graffe quando aggiungo tra parentesi graffe ottengo un errore di compilazione XSLT ...: { –

+0

Buona domanda (+1). Guarda la risposta qui sotto :) –

risposta

13

Questo è di progettazione. L'attributo select è l'unico che non accetta AVT (Attributo - Modelli valore).

La soluzione usuale è definire una variabile con il nome dell'elemento figlio da utilizzare come chiave di ordinamento. Sotto è un piccolo esempio:

<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> 

Quando questa trasformazione viene applicata sul seguente 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> 

il risultato voluto è prodotto:

<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ì vedi ho provato questo ... tranne; Le cose sono necessario ordinare per @attribute o child :: * –

0

Il | (operatore sindacale) funziona ... Devo averlo sbagliato leggermente se provato prima. E 'stata la risposta di @Dimitre Novatchev a guidarmi lungo la strada giusta !!

le seguenti opere:

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

Mi permette di ordinamento su attributi e nodi. Ovviamente, a patto che non abbiano lo stesso name() ma valori diversi.

+1

@Will: Please non pubblicare nella sezione inferiore della pagina a meno che non stia pubblicando una risposta effettiva. StackOverflow non è come un forum classico. Grazie. ;) – Tomalak

+0

Non stavo ... stavo dicendo che questo è il custode, scusa un po 'confuso. –

+0

@Will Hancock: Felice questa risposta è stata utile. Potresti anche decidere di accettarlo :) –

Problemi correlati