fn:not

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 5.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

   

Kategorie: boolesche Funktionen

Herkunft: XPath 1.0

Rückgabewert: Die Funktion fn:not() gibt die boolesche Negation ihres (in einen booleschen Wert umgewandelten) Arguments aus. Ist dieses true, so ist der Rückgabewert false und umgekehrt.

Aufruf/Argumente:

fn:not($eingabewert)

$eingabewert:
Der Eingabewert der Funktion muss ein boolescher Wert sein. Handelt es sich nicht um einen booleschen Wert, so wird die Eingabe ent­sprechend der Funktion fn:boolean() in ihren effektiven booleschen Wert umgewandelt. Wird der Funktion die leere Sequenz übergeben, so gibt sie false zurück.

Verwendungszweck:

Die Funktion fn:not() wird oft zur Formulierung von Bedingungen für xsl:if oder Ähnliches verwendet, um die boole­sche Negation eines übergebenen Wertes auszudrücken.

Das Argument wird vorher, falls erforderlich, in einen booleschen Wert umgewandelt. Die Funk­tion verhält sich mit anderen Worten analog zur Funktion fn:boolean(), gibt aber bei gleichem Input jeweils den zu fn:boolean() entgegengesetzten Wert zurück.

In diesem Zusammenhang sollte erwähnt werden, dass die auf den ersten Blick scheinbar gleich­wertigen Ausdrücke

fn:not($operand1 = $operand2)

und

$operand1 != $operand2

unterschiedlich interpretiert werden. Die Funktion fn:not() negiert den gesamten Ausdruck, gibt also false zurück, wenn die beiden Operanden des inneren Ausdrucks gleich sind, und true, wenn sie ungleich sind. Das gilt auch für den zweiten Ausdruck, aber nur dann, wenn beide verglichenen Operan­den tatsächlich existieren.

Sowohl im Test auf Gleichheit mit = als auch in dem auf Ungleichheit mit != ist implizit zusätzlich die Bedeutung »falls die Operanden existieren« enthal­ten – existiert einer von beiden nicht, ist das Ergebnis stets false. Der zweite Ausdruck ist also false, sowohl im Fall der Ungleichheit beider Operanden als auch bei Nichtexistenz eines der beiden.

Die Funktion fn:not() verkapselt den inneren Ausdruck und verhält sich des­halb anders. Der Ausdruck im oberen Beispiel gibt true zurück, wenn $operand1 ungleich $operand2 ist, aber auch dann, wenn einer der beiden Operanden nicht existiert. Dies liegt daran, dass der innere Ausdruck – wie oben beschrieben – in diesem Fall false ist.

Beispiele:

Beispiel 1 – Test auf Abwesenheit von Kindknoten:

<xsl:if test="fn:not(node())">
   <!-- Content-Konstruktor -->
</xsl:if>

Dieser Test, der den Nodetest node() zu Hilfe nimmt, gibt true zurück, wenn der Current Node keine Kindknoten besitzt. In diesem Fall wird der im Inneren befindliche Template-Body ausgeführt.

Beispiel 2 – Ausschluss bei xsl:for-each-Schleife:

<xsl:for-each select="*[fn:not(self::beispiel)]">
   <!-- Content-Konstruktor -->
</xsl:for-each>

Das xsl:for-each-Statement wählt zunächst alle Kindelemente * des Current Nodes, schließt jedoch über ein Predicate [fn:not(self::beispiel)] die Elemente <beispiel> aus.

Beispiel 3 – Prüfen, ob Attribut fehlt oder leer ist:

<xsl:if test="fn:not(fn:string(@preis))">
  <xsl:text>Keine Preisangabe verfügbar!</xsl:text>
</xsl:if>

Der Test prüft, ob ein Attribut preis des Current Nodes leer oder überhaupt nicht vorhanden ist. Es nimmt die Funktion fn:string() zu Hilfe, um den Attributwert in einen String umzuwandeln. Dies ist erforderlich, da sonst nur die Abwesenheit des Attributs erkannt werden könnte, aber nicht, ob es einen leeren String enthält. Der Stringwert des leeren Attributs ergibt negiert ebenso true, so wie es das von vornherein fehlende Attribut täte.

Der Sicherheit halber könnte der Attributwert im Vorfeld mit fn:normalize-space() normalisiert werden, um die Möglichkeit auszuschließen, dass dieser nur aus Leerzeichen besteht:

fn:not(fn:string(fn:normalize-space(@preis)))

Funktionsdefinition:

XPath 1.0:

not(boolean) => boolean

XPath 2.0:

fn:not($arg as item()*) as xs:boolean

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn