Wie kann ich mit XSL überprüfen, ob ein Wert null oder leer ist ?
Zum Beispiel, wenn categoryName
leer ist? Ich verwende ein bei der Auswahl des Konstrukts.
Zum Beispiel:
<xsl:choose>
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="other" />
</xsl:otherwise>
</xsl:choose>
xsl:when
für Knotentests verwenden. Betrachten Sie<xsl:template match="Category[categoryName[not(node())]]">...
zusammen mit einem<xsl:template match="Category">...
. Der Prozessor trifft dann die richtigen Entscheidungen für Sie und Sie müssen die verschachtelte Geschäftslogikxsl:choose
nicht mehr ausschreiben. In vielen Fällen erleichtert die Verwendung passender Vorlagen das Schreiben von Stylesheets.Antworten:
Bearbeiten : Dies deckt meiner Meinung nach die wahrscheinlichste Interpretation von "[nicht] null oder leer" ab, wie aus der Frage abgeleitet, einschließlich des Pseudocodes und meiner eigenen frühen Erfahrung mit XSLT. Dh "Was entspricht dem folgenden Java?":
Weitere Einzelheiten, z. B. die eindeutige Identifizierung von Null und Leer, finden Sie in Johnveys Antwort unten und / oder in der XSLT-Geige, die ich aus dieser Antwort übernommen habe. Diese enthält die Option in Michael Kays Kommentar sowie die sechstmögliche Interpretation.
quelle
test="not(categoryName = '')"
. Die angegebene Antwort gibt false zurück, wenn das Element categoryName fehlt, was bei meiner Interpretation der Frage zu einer falschen Antwort führt.<xsl:for-each select="root/*[matches(name(.), 'grp')]">
damit es in VS2010 verwendet werden kann?Ohne weitere Informationen gehe ich von folgendem XML aus:
Ein Anwendungsbeispiel würde folgendermaßen aussehen:
quelle
</CategoryName>
? , leere</CategoryName>
und es besteht auch keine Notwendigkeit dafür.Vom leeren Element :
Um zu testen, ob der Wert eines bestimmten Knotens leer ist
Es kommt darauf an, was du mit leer meinst.
not(node())
not(string(.))
not(normalize-space(.))
not(node()[not(self::comment())])
quelle
not(text())
. Eine Alternative zu Ihrer 2. Kugel ist auchnot(.//text())
. Wie Ihre letzte Kugel zeigt: Es gibt viele Möglichkeiten, "Nichts" zu betrachten;).if ($mystring) then ... else ...
Wie wäre es mit?
quelle
<categoryName> <!-- some comment --> </categoryName>
und ansonsten keinen aussagekräftigen Text, wird dies immer noch alstrue
Die ersten beiden befassen sich mit dem Nullwert und die zweiten beiden mit der leeren Zeichenfolge.
quelle
xsl:apply-templates
und passende Vorlagen, um das zu erhalten, was Sie möchten, viel einfacher.In einigen Fällen möchten Sie möglicherweise wissen, wann der Wert speziell null ist. Dies ist insbesondere erforderlich, wenn Sie XML verwenden, das aus .NET-Objekten serialisiert wurde. Während die akzeptierte Antwort dafür funktioniert, gibt sie auch das gleiche Ergebnis zurück, wenn die Zeichenfolge leer oder leer ist, dh '', sodass Sie nicht unterscheiden können.
Sie können das Attribut also einfach testen.
Manchmal ist es notwendig, den genauen Status zu kennen, und Sie können nicht einfach überprüfen, ob CategoryName instanziiert ist, da im Gegensatz zu Javascript
Gibt true für ein Nullelement zurück.
quelle
Ich weiß, dass diese Frage alt ist, aber zwischen all den Antworten vermisse ich eine, die ein gängiger Ansatz für diesen Anwendungsfall in der XSLT-Entwicklung ist.
Ich stelle mir vor, dass der fehlende Code im OP ungefähr so aussieht:
Und dass die Eingabe ungefähr so aussieht:
Das heißt, ich gehe davon aus, dass es null, leere, einzelne oder mehrere
categoryName
Elemente geben kann. Mit all diesen Fällen mitxsl:choose
Konstrukten im Stil umzugehen , oder mit anderen Worten, zwingend, wird schnell chaotisch (umso mehr, wenn sich Elemente auf verschiedenen Ebenen befinden können!). Eine typische Programmiersprache in XSLT ist die Verwendung von Vorlagen (daher das T in XSLT). Dies ist eine deklarative Programmierung, nicht zwingend erforderlich (Sie teilen dem Prozessor nicht mit, was zu tun ist, sondern nur, was ausgegeben werden soll, wenn bestimmte Bedingungen erfüllt sind). Für diesen Anwendungsfall kann das ungefähr so aussehen:Dies funktioniert (mit jeder XSLT-Version), da die erste oben eine höhere Priorität hat (sie hat ein Prädikat). Die "Fall-Through" -Matching-Vorlage, die zweite, fängt alles auf, was nicht gültig ist. Der dritte sorgt dann dafür, dass der
categoryName
Wert ordnungsgemäß ausgegeben wird.Beachten Sie, dass in diesem Szenario keine spezifische Übereinstimmung erforderlich ist
categories
odercategory
, da der Prozessor automatisch alle untergeordneten Elemente verarbeitet, sofern nicht anders angegeben (in diesem Beispiel werden die untergeordneten Elemente in der zweiten und dritten Vorlage nicht weiter verarbeitet, da keinxsl:apply-templates
In vorhanden ist Sie).Dieser Ansatz ist leichter erweiterbar als der zwingende Ansatz, da er automatisch mehrere Kategorien behandelt und durch Hinzufügen einer weiteren passenden Vorlage für andere Elemente oder Ausnahmen erweitert werden kann. Programmierung ohne if-Verzweigungen .
Hinweis:
null
In XML gibt es keine . Es gibt xsi: nil , aber das wird selten verwendet, besonders selten in untypisierten Szenarien ohne irgendein Schema.quelle
Dies ist wahrscheinlich der einfachste XPath-Ausdruck (der in der akzeptierten Antwort liefert einen Test für das Gegenteil und wäre länger, wenn er negiert würde):
Erklärung :
Das Argument für die
not()
obige Funktion istfalse()
genau dann, wenn es keincategoryName
untergeordnetes Element ("null") des Kontextelements gibt oder das (einzelne solche)categoryName
untergeordnete Element einen Zeichenfolgenwert hat - die leere Zeichenfolge.In XSLT 2.0 verwenden :
Hier ist ein vollständiges Beispiel :
Wenn diese Umwandlung auf das folgende XML-Dokument angewendet wird:
Das gewünschte, korrekte Ergebnis wird erzeugt :
Bei Anwendung auf dieses XML-Dokument :
oder dazu:
oder darauf
Das richtige Ergebnis wird erzielt :
Verwenden Sie in ähnlicher Weise diese XSLT 1.0- Transformation:
Beachten Sie : Es werden überhaupt keine Bedingungen verwendet. Erfahren Sie in diesem schönen Pluralsight-Kurs mehr darüber, wie wichtig es ist, bedingte Konstrukte zu vermeiden:
" Taktische Entwurfsmuster in .NET: Kontrollfluss "
quelle
Wenn die Möglichkeit besteht, dass das Element im XML nicht vorhanden ist, würde ich testen, ob das Element vorhanden ist und ob die Zeichenfolgenlänge größer als Null ist:
quelle
categoryName
angibt, wenncategoryName
im aktuellen Kontext keine untergeordneten Elemente vorhanden sind ) wird als leere Zeichenfolge definiert. Dies ist also redundant -string-length(categoryName)
ist Null, wenn keinecategoryName
Elemente vorhanden sind .Wenn für einen Knoten in der Eingabe-XML kein Wert verfügbar ist, wie unter xpath,
Die Funktion string () wird in einen leeren Wert konvertiert. Das funktioniert also gut:
quelle
So etwas funktioniert bei mir:
Oder umgekehrt:
Hinweis: Wenn Sie keine Nullwerte prüfen oder keine Nullwerte verarbeiten, gibt IE7 -2147483648 anstelle von NaN zurück.
quelle
Ich fand es eigentlich besser, nur auf die Länge der Zeichenfolge zu testen, da das Feld oft nicht null ist, sondern nur leer
quelle
Nach meiner Erfahrung ist der beste Weg:
quelle
Verwenden Sie einfach categoryName / text (). Ein solcher Test funktioniert auch
<categoryName/>
und<categoryName></categoryName>
.quelle