353 Stimmen

Prüfen, ob ein String in XSLT null oder leer ist

Wie kann ich prüfen, ob ein Wert null oder leer ist mit XSL ?

Zum Beispiel, wenn categoryName leer ist? Ich verwende 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>

8voto

Dimitre Novatchev Punkte 234995

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 "

7voto

DustJones Punkte 71

In einigen Fällen möchten Sie vielleicht wissen, wann der Wert genau null ist, was insbesondere bei der Verwendung von XML, das aus .NET-Objekten serialisiert wurde, notwendig ist. Die akzeptierte Antwort funktioniert zwar in diesem Fall, liefert aber auch dasselbe Ergebnis, wenn die Zeichenkette leer ist, d. h. '', so dass man nicht unterscheiden kann.

<group>
    <item>
        <id>item 1</id>
        <CategoryName xsi:nil="true" />
    </item>
</group>

So können Sie das Attribut einfach testen.

<xsl:if test="CategoryName/@xsi:nil='true'">
   Hello World.
</xsl:if>

Manchmal ist es notwendig, den genauen Zustand zu kennen, und man kann nicht einfach prüfen, ob CategoryName instanziiert ist, denn im Gegensatz zu z.B. Javascript

<xsl:if test="CategoryName">
   Hello World.
</xsl:if>

Gibt bei einem Nullelement true zurück.

5voto

Marie Taylor Punkte 41

Wenn die Möglichkeit besteht, dass das Element nicht in der XML-Datei vorhanden ist, würde ich sowohl prüfen, ob das Element vorhanden ist, als auch, ob die String-Länge größer als Null ist:

<xsl:choose>
    <xsl:when test="categoryName and string-length(categoryName) &gt; 0">
        <xsl:value-of select="categoryName " />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="other" />
    </xsl:otherwise>
</xsl:choose>

3voto

Sanjeev Singh Punkte 3800

Wenn ein Knoten keinen Wert in der Eingabe-Xml hat, wie unten xpath,

<node>
    <ErrorCode/>
</node>

Die Funktion string() konvertiert in einen leeren Wert. Das funktioniert also gut:

string(/Node/ErrorCode) =''

2voto

HSol Punkte 21

So etwas funktioniert bei mir:

<xsl:choose>
  <xsl:when test="string(number(categoryName)) = 'NaN'"> - </xsl:when> 
  <xsl:otherwise> 
    <xsl:number value="categoryName" />
  </xsl:otherwise>
</xsl:choose>

Oder andersherum:

<xsl:choose>
  <xsl:when test="string(number(categoryName)) != 'NaN'">
    <xsl:number value="categoryName" />
  </xsl:when> 
  <xsl:otherwise> - </xsl:otherwise>
</xsl:choose>

Hinweis: Wenn Sie Null-Werte nicht prüfen oder Null-Werte behandeln, gibt IE7 -2147483648 statt NaN zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X