Wie kann ich mit XSL prüfen, ob ein Wert null oder leer ist?
Zum Beispiel, wenn categoryName
leer ist?
Dies ist wahrscheinlich der einfachste XPath-Ausdruck (die in der akzeptierten Antwort enthaltene Frage ist ein Test für das Gegenteil und wäre länger, wenn sie verneint würde):
not(string(categoryName))
Erläuterung :
Das Argument für die not()
obige Funktion ist false()
genau dann, wenn es keine categoryName
Kind ("null") des Kontextelements, oder die (einzige solche) categoryName
Kind hat String-Wert - die leere Zeichenkette.
Ich benutze eine bei der Auswahl konstruieren.
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>
In XSLT 2.0 verwenden Sie :
<xsl:copy-of select="concat(categoryName, $vOther[not(string(current()/categoryName))])"/>
Hier ist ein vollständiges Beispiel :
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vOther" select="'Other'"/>
<xsl:template match="/">
<xsl:copy-of select="concat(categoryName,$vOther[not(string(current()/categoryName))])"/>
</xsl:template>
</xsl:stylesheet>
Wenn diese Transformation auf das folgende XML-Dokument angewendet wird:
<categoryName>X</categoryName>
das gewünschte, korrekte Ergebnis erzielt wird :
X
Bei Anwendung auf dieses XML-Dokument :
<categoryName></categoryName>
oder hierauf:
<categoryName/>
oder auf dieser
<somethingElse>Y</somethingElse>
das richtige Ergebnis erzielt wird :
Other
Verwenden Sie in ähnlicher Weise diese XSLT 1.0 Umwandlung:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vOther" select="'Other'"/>
<xsl:template match="/">
<xsl:copy-of select=
"concat(categoryName, substring($vOther, 1 div not(string(categoryName))))"/>
</xsl:template>
</xsl:stylesheet>
Bitte beachten : Es werden überhaupt keine Konditionalien verwendet. Erfahren Sie mehr über die Bedeutung der Vermeidung von bedingten Konstrukten in diesem schönen Pluralsight-Kurs:
" Taktische Entwurfsmuster in .NET: Kontrollfluss "