2010-02-24 10 views
11

Hallo bin ich eine generische Vorlage erstellen, um meinen Inhalt aufzulisten. Aber der Inhalt kann nach verschiedenen @ oder node() sortiert sein. So wollen in den XPath passieren.Verwenden von Variablen 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> 

eine Variable auf- oder absteigend in die order="" WORKS fallen zu lassen.

Warum kann dies nicht auf die select=""?

Ich hoffe, diese super dynamische die Select-Variable kann xPtah entweder @publish oder Title/node() oder eine beliebige xPath sein.

Es gibt keinen Fehler - Es ignoriert nur die Sortierung.

+0

W3c Spezifikation sagt; xsl: sort hat ein Auswahlattribut, dessen Wert ein Ausdruck ist. und Ausdruck wird festgelegt als; Ausdrücke auftreten als der Wert bestimmter Attribute auf XSLT-definierten Elementen und in geschweiften Klammern Wenn ich geschweifte Klammern hinzufügen bekomme ich einen XSLT-Kompilierungsfehler ...: { –

+0

Gute Frage (+1). Siehe die Antwort unten :) –

Antwort

13

Dies ist mit Absicht. Das Attribut select ist das einzige Attribut, das keine AVTs (Attribut - Wertvorlagen) akzeptiert.

Die übliche Lösung besteht darin, eine Variable mit dem Namen des Kindelements zu definieren, das als Sortierschlüssel verwendet werden soll. Im Folgenden finden Sie ein kleines Beispiel:

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

Wenn diese Transformation auf die folgende XML-Dokument angewendet wird:

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

das gewünschte Ergebnis hergestellt:

<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, ja siehe ich habe das versucht ... außer; Die Dinge muss ich nach @attribute oder Kind sortieren :: * –

0

Die | (Union Operator) funktioniert ... Ich muss es etwas falsch geraten haben, wenn ich es vorher versucht habe. Es war die Antwort von @Dimitre Novatchev, die mich auf den richtigen Weg führte!

Die folgenden Werke:

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

Es hat mich auf Attribute und Knoten sortieren können. Offensichtlich, solange sie nicht die gleichen name() aber unterschiedliche Werte haben.

+1

@Will: Bitte poste nicht in den unteren Bereich der Seite, es sei denn, du postest eine tatsächliche Antwort. StackOverflow ist nicht wie ein klassisches Forum. Vielen Dank. ;) – Tomalak

+0

War nicht ... sagte, das ist der Anser, sorry bisschen verwirrt. –

+0

@Will Hancock: Ich bin froh, dass diese Antwort nützlich war. Sie können sogar in Betracht ziehen, es zu akzeptieren :) –

Verwandte Themen