XSLT: Holen Sie sich das nächste Element mit einem angegebenen Wert definiert? (Sitecore)

StackOverflow https://stackoverflow.com/questions/2216567

  •  19-09-2019
  •  | 
  •  

Frage

Ich habe die aktuelle Struktur;

Item 1
 - Subitem 1
 - Subitem 2
 - Subitem 3
 - - Sub subitem 1
 - - Sub subitem 2
 - - Sub subitem 3
 - - etc

Ich habe ein Feld, das nur auf "Punkt 1" definiert ist. Nennen wir es "Header".

Wenn ich auf "Punkt 1" bin, ist es einfach genug, diesen Wert zu extrahieren, aber was ist, wenn ich auf den anderen Gegenständen bin? Gibt es eine Möglichkeit, wie ich den Baum (hoch) durchgehen kann, bis ich ein Feld namens "Header" finde und es einen Wert hat, und dann anhalten und als Referenzpunkt in meinen Subelementen verwenden?

War es hilfreich?

Lösung

Wenn Sie den Baum nachschlagen und das nächste Element finden möchten, das a enthält Header Attribut mit einem Wert, so etwas sollte funktionieren.

  <xsl:value-of select="(ancestor::*/@Header[.!=''])[last()]" />

Dies verwendet die ancestor Achse, um den Baum nachzuschlagen, und der XPath -Ausdruck sucht nach jedem Element mit a Header Attribut, wer Wert ist, ist nicht leer.

Ein zweiter Filter wird verwendet, um die zu bewerten letzte eines. Wenn es mehr als einen Vorfahr gibt, der eine hat @Header mit einem Wert die letzte Man wäre am nächsten am Kontextknoten, da das Ergebnis in der Fall ist Dokumentbestellung.

BEARBEITEN: Eine alternative Möglichkeit, die gleichen Ergebnisse zu finden, um die Tatsache zu nutzen, dass ancestor Achse kehrt zurück Umgekehrte Dokumentreihenfolge würde sein, die Filterkriterien in das Prädikat für die zu setzen ancestor Axis -Schritt, wählen Sie den ersten aus (am nächsten mit dem Kontextknoten übereinstimmen) und treten Sie dann in den @header:

<xsl:value-of select="ancestor::*[@Header!=''][1]/@Header" />

Andere Tipps

Wenn Ihr aktueller Kontext nicht ist Item 1 sondern eines seiner Kinder können Sie das verwenden ancestor Achse, um ihre Daten zu erhalten.

Also unter Annahme Ihrer Item 1 Element hat ein Attribut namens genannt Header, Sie können so etwas tun:

<xsl:value-of select="ancestor::Item1/@Header"/>

Dies setzt voraus, dass Ihre XML -Struktur (die Sie wirklich in Ihrer Frage hätten geliefert haben sollten) wie folgt aus:

<Item1 Header="a header">
  <Subitem1/>
  <Subitem2/>
  <!-- etc -->
</Item1>

Und dass der Name "Element1" in dieser Struktur eindeutig ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top