Kontextlisten speichern und abrufen

Eine Kontextliste ist eine Liste von Dateien oder Links. Eine solche Liste wird normalerweise mit der NPSOBJ-list-Anweisung erzeugt, in der der Name eines Feldes wie children oder toclist oder auch der Name eines Linklist-Feldes angegeben wird.

Solche Listen können in Export-Variablen gespeichert werden. Dies allein hätte keine Vorteile gegenüber der Verwendung einer eingebauten Kontextliste wie toclist in einer NPSOBJ-list-Anweisung. Man kann jedoch die in einer Export-Variablen gespeicherte Kontextliste erweitern, d. h. weitere Kontextlisten an sie anhängen. Die in der Variablen gespeicherte Liste lässt sich darüber hinaus sortieren und beschneiden. Der Code im folgenden Beispiel nimmt an, dass die aktuelle Datei ein Ordner mit Unterordnern ist. In der Variablen mylist sollen die Dateien sämtlicher Unterordner abgelegt werden, sofern deren kundenspezifisches Feld showInList den Wert YES hat:

<npsobj list="toclist">
  <npsobj condition="isEqual" name1="objType" value2="publication">
    <npsobj list="children">
      <npsobj condition="isEqual" name1="showInList" value2="YES">
        <npsobj modifyvar="append" varname="mylist" name="self" />
      </npsobj>
    </npsobj>
  </npsobj>
</npsobj>

In der inneren Liste hängt die modifyvar-append-Anweisung die aktuell in der Liste bearbeitete Datei, die mit self referenziert wird, an mylist an. self ergibt – wie auch parent, previous und next – eine Kontextliste mit genau einem Element. Anstelle der inneren Liste hätte auch

<npsobj modifyvar="append" varname="mylist" name="children" />

verwendet werden können, wenn nicht die condition-Anweisung erforderlich gewesen wäre, um die Dateien nach showInList zu selektieren.

Der Code zeigt nebenbei, dass man eine modifyvar-append-Anweisung auch dann verwenden kann, wenn die Export-Variable noch nicht existiert. Dadurch brauchen Variablen nicht initialisiert zu werden.

Einer Export-Variablen kann man mit der folgenden Anweisung eine Kontextliste zuweisen:

<npsobj modifyvar="set" varname="mylist" name="toclist" />

Neben toclist können alle Namen angegeben werden, die einen einzelnen Kontext oder eine Kontextliste ergeben. Dies sind unter anderem: self, parent, children, die Namen von Variablen, denen eine Kontextliste zugewiesen wurde und die Namen von Linklist-Feldern.

Die Kontextlisten in Export-Variablen lassen sich mit einer modifyvar-range-Anweisung kürzen. So entfernt der folgende Code das erste Element (d. h. den ersten Kontext) aus der Liste mylist:

<npsobj modifyvar="range" varname="mylist" start="2" />

Wie bei der NPSOBJ-list-Anweisung kann zusätzlich zu start auch length oder end verwendet werden, um den gewünschten Ausschnitt der Liste festzulegen. Während mit length die Anzahl der gewünschten Elemente angegeben wird, kann mit end der Index des letzten Elements festgelegt werden. Der Index des ersten Elements ist 1.

Um die in einer Export-Variablen gespeicherte Kontextliste zu sortieren, verwendet man eine modifyvar-sort-Anweisung, die im Abschnitt npsobj_modifyvar_sort beschrieben ist.

Sie können die Variablen, in denen Sie Kontextlisten gespeichert haben, in NPSOBJ-list- und -table-Anweisungen angeben, um beispielsweise eine Linkliste zu erzeugen:

<npsobj list="export.mylist">
  <npsobj insertvalue="anchor" name="self">
    <npsobj insertvalue="var" name="title" /><br>
  </npsobj>
</npsobj>

Kontextlisten sind nicht auf Dateikontexte beschränkt, sondern können auch freie Links enthalten. Bei Bedarf lassen sich Datei- und Linkkontexte auch mischen. Der Code, der eine solche gemischte Liste verarbeitet, muss den Typ jedes Kontexts prüfen. Zu diesem Zweck kann man beispielsweise den Kontext in einer switch-Anweisung nach dem Wert eines Feldes (etwa objType) fragen, der bei Dateien niemals und bei Links immer leer ist.

<npsobj list="export.mymixedlist">
  <npsobj switch="objType">
    <npsobj casecond="isEmpty">
      Muss Link-Kontext sein
    </npsobj>
    <npsobj casecond="default">
      Muss Datei-Kontext sein
    </npsobj>
  </npsobj>
</npsobj>

Ab Version 6.5.0 ist es möglich, auf Kontextlisten, die nur einen einzelnen Kontext enthalten, so zuzugreifen wie auf den Kontext selbst. Es ist also nicht erforderlich, mit npsobj list über die Liste zu iterieren. Beispiel:

<npsobj modifyvar="set" varname="savedContext" name="self" />
...
<npsobj condition="isNotEmpty" name="export.savedContext">
  <npsobj insertvalue="var" name="savedContext.path" />
</npsobj>