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:
<xsl:template match="category">
<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>
</category>
Und dass die Eingabe ungefähr so aussieht:
<categories>
<category>
<categoryName>Books</categoryName>
</category>
<category>
<categoryName>Magazines</categoryName>
<categoryName>Periodicals</categoryName>
<categoryName>Journals</categoryName>
</category>
<category>
<categoryName><!-- please fill in category --></categoryName>
</category>
<category>
<categoryName />
</category>
<category />
</categories>
Das heißt, ich gehe davon aus, dass es null, leere, einzelne oder mehrere categoryName
Elemente geben kann. Mit all diesen Fällen mit xsl: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:
<!-- positive test, any category with a valid categoryName -->
<xsl:template match="category[categoryName[text()]]">
<xsl:apply-templates />
</xsl:template>
<!-- any other category (without categoryName, "null", with comments etc) -->
<xsl:template match="category">
<xsl:text>Category: Other</xsl:text>
</xsl:template>
<!-- matching the categoryName itself for easy handling of multiple names -->
<xsl:template match="categoryName">
<xsl:text>Category: </xsl:text>
<xsl:value-of select="." />
</xsl:template>
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
oder category
, 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 kein xsl: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.