Wie testen Sie in XSLT, ob eine Variable existiert?

7

Wie testen Sie bei der Verwendung von XSLT, ob eine lokal begrenzte Variable existiert, oder ist das überhaupt möglich?

    
rjzii 19.08.2009, 13:04
quelle

7 Antworten

18

Wenn Sie das XSLT-Stylesheet als XML-DOM betrachten, macht ein Variablendeklarationselement die Variable für alle folgenden Geschwister und ihre Nachkommen sichtbar. Dadurch können XSLT-Prozessoren jeden XPath, der eine Variablenreferenz enthält, statisch analysieren, um festzustellen, ob die Variable existiert. Wenn die Variablendeklaration auf der Vorgänger-Geschwister- oder Vorgängerachse existiert, ist die Variablenreferenz zulässig, andernfalls nicht.

Beachten Sie, dass dies vollständig von der Struktur des XSLT abhängt, nicht von der Struktur des zu verarbeitenden XML. Der XSLT-Prozessor kann und sollte einen Fehler erzeugen, wenn ein XPath-Ausdruck eine Variable verwendet, die nicht existiert.

Es gibt keine Möglichkeit, diese Bedingung in XSLT zu überprüfen, da diese Bedingung in XSLT nicht zulässig ist. Die Situation, die Sie in Ihrem Kommentar beschrieben haben - "Die Idee ist, eine Flag-Variable zu setzen, wenn etwas ausgegeben wird und später eine andere Nachricht anzeigt, wenn nichts ausgegeben wurde." - sollte eigentlich zu einem Syntaxfehler führen. Zum Beispiel, wenn Sie so etwas tun:

%Vor%

Sie erhalten einen Syntaxfehler: Das zweite xsl:if -Element ist weder ein nachfolgendes Geschwister der Variablendeklaration noch eines ihrer Nachkommen.

Hier ist eine Technik, die ich für einen fairen Betrag verwende - dies erzeugt variable Ausgabe basierend auf einer Vielzahl von verschiedenen Bedingungen, die Sie später nicht erneut überprüfen möchten:

%Vor%     
Robert Rossney 20.08.2009, 18:27
quelle
12

Wenn Sie diese Frage stellen, haben Sie den Schlüsselpunkt von XSLT nicht vollständig verstanden. : -)

Es ist deklarativ: nichts kann existieren, wenn Sie es nicht deklarieren. Du deklarierst eine Variable, dann ist es da, du nicht, dann ist es nicht.

Nicht ein einziges Mal wird es den Punkt geben, an dem man sich beim Codieren fragen muss, ob eine bestimmte Variable existiert.

XSLT hat strenge Scoping-Regeln, Variablen existieren nur innerhalb des Bereichs ihres übergeordneten Elements (und nicht alle Elemente können anfänglich Variablen enthalten). Sobald Sie das übergeordnete Element verlassen, ist die Variable verschwunden.

Wenn Sie also Ihre Frage / Absicht nicht weiter spezifizieren, ist die einzige gültige Antwort, dass die Frage falsch ist. Sie können nicht und müssen nicht überprüfen, ob eine Variable zur Laufzeit existiert.

    
Tomalak 19.08.2009 14:45
quelle
3

XSL-Variablen sind streng beschränkt, so dass Sie nicht in Geschwisterknoten, sondern nur in Kindern darauf zugreifen können. Wenn Sie mit Parametern arbeiten, können Sie eine globale <xsl:param /> verwenden.

Siehe: Ссылка

    
StarSignLeo 19.08.2009 13:16
quelle
1

Ich glaube nicht, dass es möglich ist, aber Sie werden es wahrscheinlich nie brauchen, weil die Variable nicht existiert, wenn Sie sie nicht deklariert haben.

    
Michael Krelin - hacker 19.08.2009 13:13
quelle
1

Wenn Sie eine Variable haben, können Sie überprüfen, ob sie etwas enthält oder "existiert", indem Sie etwa Folgendes tun:

%Vor%

Hinsichtlich seiner Gültigkeit kann ich nicht sicher sein. Ich werde Ihnen jedoch sagen, dass ich dies in einigen unserer Systeme bei der Arbeit mache;)

    
Kezzer 19.08.2009 13:17
quelle
1

Beste und schnellste Idee, um walue zu überprüfen, wenn es vorhanden ist, überprüfen Sie es Länge

%Vor%     
Karol 25.07.2013 15:03
quelle
0

In jeder Programmiersprache haben Sie genau das gleiche Verhalten.

Nehmen Sie C #. Wenn Sie versuchen, auf einen nicht deklarierten Variablennamen zu verweisen, wird eine Fehlermeldung angezeigt. Dies ist definitiv ein Programmierfehler.

Warum sollte XSLT sich anders verhalten? ?

Wenn wir über "vor" und "später" nachdenken, oder über eine Variable, die mehr als einen Wert haben würde, um zu bezeichnen, in welchem ​​"Zustand" wir uns befinden - all das ist per Definition nicht in XSLT erlaubt - und genau das Fehlen solcher "Merkmale" macht XSLT zur schönen und eleganten funktionalen Sprache.

    
Dimitre Novatchev 20.08.2009 13:59
quelle

Tags und Links