SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




XSL / Werte sortieren

Geprüfte Antwort Dieser Beitrag hat 19 Antworten

Ohne Rang
271 Beiträge
Kiera erstellt 20 Jan. 2010 09:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo liebe Community,

ich bastle gerade an einem benutzerdefinierten Formular einer Liste.

In diesem Formular erzeuge ich unterhalb des eigentlichen Formularbereichs durch diverse XSL-Templates eine Ausgabe einer anderen Liste, die unter anderem ein Personenfeld mit Mehrfachauswahl beinhaltet. Ich habe es bereits hinbekommen, durch "for"-Schleifen in XSL die Namen der Personen mit Zeilenumbruch darzustellen, aber ich bekomme es einfach nicht hin, diese Werte zu sortieren.

Dazu müsste ich die Namen in eine Art Array schreiben, dieses sortieren und danach wieder ausgeben.
Leider finde ich keine Lösung dafür, da es in XSL keine Arrays gibt. Hat jemand eine andere Idee, wie ich in XSL mehrere Werte sortieren kann, bevor ich diese ausgebe?

Grüßle Kiera

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Jan. 2010 09:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das geht ganz einfach, wenn Du innerhalb der xsl:for-each Schleife als erstes Element ein xsl:sort einbaust.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 21 Jan. 2010 10:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

Danke für deinen Tip, nur leider funktioniert das in meinem Fall nicht.

Ich habe die Werte, die ich sortieren möchte, nicht ein verschiedenen Einträgen der Liste, sondern in einem Feld in einem Eintrag.
In meinem Personen-Feld stehen mehrere Personen pro Listeneintrag, und diese möchte ich sortieren.

Ich müsste irgendwie die Ausgabe der verschiedenen Personen pro Zeile abfangen, in ein "Array" schreiben und das dann sortieren. Nur hab ich jetzt schon rausgefunden, dass es in XSL keine Arrays gibt.
Und daher weiß ich grad nicht weiter...

Grüßle Kiera

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Jan. 2010 11:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das geht genauso. Die einzelnen Felder werden im Quell-XML als Attribute ausgegeben und Du kannst alle Attribute mit
xsl:for-each select="@*" durchgehen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 21 Jan. 2010 14:44
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hm ich bekomm das nicht hin.

Am konkreten Beispiel sieht es so aus:

- Feld "zugeordnetePersonen", welches vom Typ "Person oder Gruppe" mit Mehrfachauswahl ist ("Maier, Gerda; Huber, Harald; Schmidt, Elke")
- Diese Personen, die da drin stehen, möchte ich nun sortiert ausgeben ("Huber, Harald; Maier, Gerda; Schmidt, Elke")

Ich setze nun eine Variable:

<xsl:variable name="Personen">
<xsl:value-of select="@zugeordnetePersonen"/>
</xsl:variable>

Wenn ich dich richtig verstanden habe, müsste ich da ein <xsl:for-each select="@zugeordnetePersonen">  und ein <xsl:sort select="????"/> dazu basteln, oder?

Nun hab ich aber nichts in diesem Element drin, nach dem ich sortieren kann, denn der Inhalt des Felds sieht ja so aus:

<table cellpadding=0 cellspacing=0><tr><td class='ms-vb'><nobr><span><A HREF="/abteilungen/_layouts/userdisp.aspx?ID=111">Maier, Gerda</A><img border="0" height="1" width="3" src="/_layouts/images/blank.gif"/><a href='javascript:' onclick='IMNImageOnClick();return false;' class='ms-imnlink'><img name='imnmark' title='' border='0' height='12' width='12' src='/_layouts/images/blank.gif' alt='Keine Anwesenheitsinformationen' sip='gerda.maier@irgendwer.com' id='imn_20651,type=smtp'/></a></span></nobr></td></tr><tr><td class='ms-vb'><nobr><span><A HREF="/abteilungen/_layouts/userdisp.aspx?ID=112>Huber, Harald</A><img border="0" height="1" width="3" src="/_layouts/images/blank.gif"/><a href='javascript:' onclick='IMNImageOnClick();return false;' class='ms-imnlink'><img name='imnmark' title='' border='0' height='12' width='12' src='/_layouts/images/blank.gif' alt='Keine Anwesenheitsinformationen' sip='Harald.Huber@irgendwer.com' id='imn_20652,type=smtp'/></a></span>.....................

Kann ich trotzdem irgendwie nach Namen sortieren?

Grüßle Kiera

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Jan. 2010 15:44
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du hast bisher nicht verraten, daß es sich um ein Feld mit Mehrfachauswahl handelt.

Da sehe ich ehrlich gesagt schwarz. Der Inhalt wird ja als Attributwert übergeben und deshalb vom XSL-Prozessor als ein einziger Textknoten interpretiert. Sonst könnte man das mit select="table/tr/td/span/a" durchgehen und sortieren.

Tut mir leid, keine Idee.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 21 Jan. 2010 16:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Oh sorry, dass ich mich da ungenau ausgedrückt hab!

Ich habs ja schon geschafft, die einzelnen Namen separiert mit Zeilenumbruch auszugeben (mit vielen loops in XSL), daher war meine Idee, dass ich diese Werte EINZELN in eine andere Variable / in ein Array schreibe, die / das ich dann "intern" sortieren kann. Aber sowas wie ein Array gibts ja leider nicht.

Ich danke dir trotzdem ganz doll für deine Hilfe! :o)

Grüßle Kiera

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Jan. 2010 16:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie hast Du die Namen denn da raus gekriegt? Würde mich jetzt wirklich interessieren.

Wenn Du das geschafft hast, dann bekommt man sie auch sortiert. Es gibt zwar in XSL keine Arrays, aber sogenannte Nodesets und die erfüllen hier den selben Zweck.

Irgendwie bekommst Du ja die Namen, also bekommst Du sie auch in eine xsl:variable. Dort erzeugst Du dann einfach aus den Namen XML-Elemente. Dann gehst Du mit for-each durch die Variable und sortierst.

<xsl:variable name="alleNamen">
<!-- wie auch immer Du auf die Namen kommst, ich nehme hier an Du hast sie in einer Variablen $Name -->
<xsl:element name="person">
<xsl:attribute name="name">
<xsl:value-of select="$Name"/>
</xsl:attribute>
</xsl:element>
</xsl:variable>

Sortiert ausgeben:
<xsl:for-each select="$alleNamen">
<xsl:sort select="@name"/>
<!-- Namen ausgeben -->
<xsl:value-of select="@name"/>
</xsl:for-each>

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 22 Jan. 2010 08:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also, die Namen hab ich folgendermaßen ausgegeben bekommen:

1. Variable $Personen, in der der oben genannte Text drin steht (also alle Namen in TDs)

2. mit diesem Parameter rufe ich ein Template namens "Ausgabe" auf, welches zuerst prüft, ob in $Personen noch "<" drin steht

--> falls ja: Aufruf eines neuen Templates namens "RemoveHTML", welches den Parameter <xsl:value-of select="substring-before($Personen,'&lt;/span&gt;')"/> bekommt, also den ersten Teil der Variablen $Personen, in dem auch der erste Name drin steht.

3. Das Template "RemoveHTML" entfernt dann alle Tags um den Namen rum, sodass nur noch der Name selbst stehen bleibt. (und ich vermute genau an DIESER Stelle muss ich deinen Code einbauen?)

4. Rekursiver Aufruf des Templates "Ausgabe" mit dem Parameter <xsl:value-of select="substring-after($Personen, '&lt;/span&gt;')"/>, also dem Teil NACH dem ersten Namen, das die restlichen Namen beinhaltet.

5. usw. ;o)

Ich hoffe ich konnte in Worte fassen, was ich hier so zusammengebastelt habe :o)
Wollte aber nicht den ganzen Quelltext posten, da es sich doch über ein paar Zeilen hinzieht...

Deinen Code werde ich Montag mal versuchen einzubauen, heute komme ich da leider nicht mehr dazu.

Lieben Dank schonmal!

Grüßle Kiera

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 22 Jan. 2010 09:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, Du machst das also mit Stringfunktionen. War sicher ein ganz schönes Gebastel :-)

Letztlich bekommst Du ja als Ergebnis des Templates "Ausgabe" die einzelnen Namen zurück und genau hier kannst Du ansetzen, in dem Du diese Aufrufe in eine Variable schreibst - und zwar als neue XML-Elemente. Die kannst Du dann wie oben gezeigt wieder mit for-each durchgehen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 26 Jan. 2010 12:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, ich bekomms trotzdem nicht hin ;-) Ich versteh einfach nicht ganz, an welcher Stelle ich das neue XML-Element erstellen muss - schon vor dem Aufruf des Templates "Ausgabe" oder IM Template "Ausgabe"?

Mein Ausgabe-Template sieht folgendermaßen aus:

<xsl:template name="Ausgabe">       
        <xsl:param name="Personen"/>
        <xsl:choose>   
            <xsl:when test="contains($Personen,'&lt;/span&gt;')">               
                <xsl:variable name="pureText">
                    <xsl:call-template name="removeHtmlTags">
                        <xsl:with-param name="html"><xsl:value-of select="substring-before($perstext_org,'&lt;/span&gt;')"/></xsl:with-param>
                    </xsl:call-template>
                </xsl:variable>                                       
   
                <!-- Ausgabe -->
                <xsl:value-of select="$pureText"/><br/>
           
                <!-- rekursiver Aufruf -->
                <xsl:call-template name="Ausgabe">
                    <xsl:with-param name="perstext_org"><xsl:value-of select="substring-after($perstext_org,'&lt;/span&gt;')"/></xsl:with-param>               
                </xsl:call-template>

            </xsl:when>                                                       
       </xsl:choose>           
       
</xsl:template>

Hast Du vielleicht noch nen kleinen Hinweis? :-)

Grüßle Kiera

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Jan. 2010 15:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

An der Stelle, wo Du das Template aufrufst:

<xsl:variable name="Personnames">
<PERSON>
<xsl:attribute name="name">
<xsl:call-template name="Ausgabe">
<xsl:with-param name="Personen" select="@YourPersonField" />
</xsl:call-template>
</xsl:attribute>
<PERSON>
</xsl:variable>

Jetzt solltest Du die einzelnen Personen so durchgehen können:

<xsl:for-each select="$Personnames">
<xsl:sort select="@name"/>
...
</xsl:for-each>

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 26 Jan. 2010 17:35
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

So dachte ich mir das auch, geht aber leider nicht.

Da kommt die Fehlermeldung "Prozessorstylesheet konnte nicht festgelegt werden: 0x80004005: Ein Ausdruck muss sich auf einen Knotensatz beziehen. -->$Personnames<--"

Ich vermute, das liegt daran, dass das Ausgabe-Template ja an dieser Stelle schon wieder alle Namen zusammen zurückgibt und nicht jeden Namen einzeln.
Muss ich nicht irgendwie die Variable "Personnames" zuerst erstellen, und dann innerhalb des Templates "Ausgabe" die einzelnen Attribute in dieser Variablen füllen? Ich bin verwirrt ;o)

Grüßle Kiera

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Jan. 2010 08:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da habe ich nicht aufgepaßt. Irgendwie mußt Du dafür sorgen, daß das Template "Ausgabe" die einzelnen Namen als einzelne Elemente liefert und das ganze dann so kapseln, daß das Ergebnis in der Variablen landet. Ausporbiert habe ich es nicht, bin aber zeimlich sicher, daß es geht.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 27 Jan. 2010 14:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hmm also selbst wenn ich feste Werte in deinem Beispiel verwende, funktioniert das so nicht.:

<xsl:variable name="alleNamen">
   <PERSON> <!-- habs auch mit <xsl:element name="PERSON"> versucht -->
        <xsl:attribute name="vname">Hans</xsl:attribute>
   </PERSON>
   <PERSON>
        <xsl:attribute name="vname">Paul</xsl:attribute>
   </PERSON>
   <PERSON>
        <xsl:attribute name="vname">Berta</xsl:attribute>
   </PERSON>
</xsl:variable>

<xsl:for-each select="$alleNamen">
   <!-- tu irgendwas -->
</xsl:for-each>

Ich bekomme wieder nur die Fehlermeldung, dass sich der Ausdruck auf einen Knotensatz beziehen muss.

Habe auch schon versucht, um alle "PERSON"-Elemente ein übergeordnetes Element zu stellen, und das dann anzusprechen, aber ging auch nicht.

Sobald ich die Elemente in einer Variable speichere, kann ich nicht mehr darauf zugreifen...

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Jan. 2010 14:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist jetzt aber sehr seltsam. Ich habe sowas schon öfter mal verwendet. Falls ich demnächst mal Zeit habe, teste ich das nochmal.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 27 Jan. 2010 14:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Vielleicht bin ich auch einfach zu schusselig.... Wer weiß!

Aber das wär super! Dankeschön! :o)

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Jan. 2010 17:09
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Kiera,

mea maxima culpa - ich bin leider schon leicht vergesslich... Dafür hab ich aber jetzt nachgeschaut :-)

Du kannst eine Variable vom Typ node-set so durchgehen:
<xsl:for-each select="msxsl:node-set($DeineVariable)/PERSON">

Die node-set() Funktion liefert dabei immer den Wurzelknoten, also /

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
271 Beiträge
Kiera Als Antwort am 28 Jan. 2010 08:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Andi, ich könnte dich wieder mal knutschen! ;o)

Jetzt hab ichs tatsächlich hinbekommen, die einzelnen Namen (die ich im Moment noch fest im Quellcode drin habe), sortiert auszugeben!

Vielen vielen Dank!!!!!!!!

Jetzt muss ich es nur noch schaffen, die Namen aus dem Personen-Feld zu separieren und in das Nodeset zu schreiben. Aber ich glaub das bekomm ich im Lauf des Tages noch hin. :o)

Grüßle Kiera

Ohne Rang
271 Beiträge
Kiera Als Antwort am 28 Jan. 2010 14:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nachtrag: ich habs geschafft :o)

Falls jemand auch so etwas benötigt, einfach melden!

Danke nochmal!