wake-up-neo.net

xsl: wenn mindestens ein untergeordneter Knoten vorhanden ist

<node>
   <node1><node11/></node1>
   <node2/>
</node>

Ich möchte, dass mein XSLT überprüft

<xsl:if test="If at least 1 child node exists">
  Only node1 can pass the if condition
</xsl:if>

Danke für jede Antwort.

14
Tran Ngu Dang

Seien Sie zunächst vorsichtig mit Ihrer Terminologie. Meinen Sie "Knoten" oder "Element"? Ein Knoten kann ein Element, ein Kommentar, ein Text oder eine Verarbeitungsanweisung sein. 

Wenn Sie hier jedoch Element meinen, um zu prüfen, dass mindestens ein untergeordnetes Element vorhanden ist, können Sie dies einfach tun (vorausgesetzt, Sie befinden sich in diesem Fall auf dem Element node .

<xsl:if test="*">

In Ihrem Kommentar wird vorgeschlagen, dass nur "node1" die if-Bedingung übergeben kann. Überprüfen Sie daher die Existenz eines bestimmten Elements

<xsl:if test="node1">
26
Tim C

Im Kontext des Knotens, den Sie testen, sollte dies funktionieren, um zu testen, ob ein Knoten über child elements verfügt:

<xsl:if test="*">
  Only node1 can pass the if condition
</xsl:if>

Wenn Sie tatsächlich Knoten meinten (die Textknoten enthalten würden), würde dies funktionieren, um Textknoten einzuschließen:

<xsl:if test="node()">
  Only node1 can pass the if condition
</xsl:if>

Aber <node> würde auch diesen Test bestehen (<node2> würde nicht). Ich nahm an, Sie sprachen nur im Zusammenhang mit den untergeordneten Knoten von <node>, aber vielleicht nicht?

5
JLRishe

Ausdrücke, die mit einem Knoten übereinstimmen, sind wahr, während Ausdrücke, die mit nichts übereinstimmen, falsch sind, also:

<xsl:if test="node()">
   ...
</xsl:if>

Ihre Frage und die implizierte Bedingung "Nur Knoten1 kann die If-Bedingung passieren" stimmen jedoch nicht mit dem Beispiel überein. Sowohl node als auch node1 haben untergeordnete Knoten, daher würden beide diese if-Bedingung übergeben.

Um es streng auf node1 zu begrenzen, müssen Sie entweder sicherstellen, dass der Vorlagenkontext geeignet ist, oder überprüfen, dass der betreffende Knoten nicht das documentElement ist.

0
Paul Butcher

Der Wortlaut der Frage ist unklar, aber ich denke, Sie möchten nur Kindknoten verarbeiten, die selbst Kinder (dh Enkel des aktuellen Knotens) haben.

<xsl:template match="node">
 do stuff for node
  <xsl:apply-templates select="*[*]"/>
</xsl:template>

wendet nur Vorlagen auf node1 an, da es einen untergeordneten Knoten hat, und es werden keine Vorlagen auf node2 angewendet.

0
David Carlisle