PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XSLT, wie leeren Knoten abfragen


PHuV
2006-06-28, 18:23:33
Frage an XSLT Spezis, wie Frage ich den einen leeren Knoten ab?

Normalerweise hat mapAttribute noch Kindelemente:

<mapAttribute key="de.xxx.yyy.ATTR_PARAMETERS_ENABLED">
<mapEntry key="BLUB" value="true"/>
<mapEntry key="LABER" value="true"/>
</mapAttribute>

Aber es kann vorkommen, daß nichts drin ist und es ein leeres Tagelement ist:

<mapAttribute key="de.xxx.yyy.ATTR_PARAMETERS_ENABLED"/>

Und wie kann ich das mit XSLT prüfen, ob dieser Fall nun vorliegt. Ich kekse mit count und not(node()) rum, geht aber nix :( .

Ich habe den XSLT-Code von einem Kollegen (der gerade im Urlaub ist), welcher mir eine
java.lang.ArrayIndexOutOfBoundsException: 1 >= 1

wirft, klar, weil keine mapEntry's vorhanden sind:


<xsl:for-each select="mapAttribute[@key='org.eclipse.debug.core.environmentVariables']/mapEntry">
<xsl:variable select="@key" name="varName"/>
<xsl:if test="/launchConfiguration/mapAttribute[@key='de.yyy.xxx.ATTR_PARAMETERS_ENABLED']/mapEntry[@key=$varName]/@value='true'">
<xsl:value-of select="@key"></xsl:value-of>
<xsl:text>=</xsl:text>
<xsl:value-of select="@value"></xsl:value-of>
<xsl:text>&#xA;</xsl:text>
</xsl:if>
</xsl:for-each>

Und jetzt will ich einfach vorher eine if-Abfrage einbauen, was vorher prüft, ob überhaupt mapAttribute ein leeres Tag ist, bekomme das aber nicht hin (als XSLT Neuling).

Der_Donnervogel
2006-06-29, 01:12:12
Ob ein Subknoten drinn ist sollte man so testen können (habs aber nicht ausprobiert):


<xsl:if test="count(/launchConfiguration/mapAttribute[@key='de.yyy.xxx.ATTR_PARAMETERS_ENABLED']/mapEntry[@key=$varName]) &gt; 0">
code falls das Element existiert
</xsl:if>

PHuV
2006-06-29, 12:19:30
Mittlerweile habe ich es genauer sondert, es liegt an einer Variablenabfrage:

<xsl:for-each select="mapAttribute[@key='org.eclipse.debug.core.environmentVariables']/mapEntry">
<xsl:if test="/launchConfiguration/mapAttribute[@key='de.actis.bom.ui.ATTR_PARAMETERS_ENABLED']/mapEntry">
<xsl:variable select="@key" name="varName"/>
<xsl:if test="$varName">
<xsl:if test="/launchConfiguration/mapAttribute[@key='de.actis.bom.ui.ATTR_PARAMETERS_ENABLED']/mapEntry[@key=$varName]/@value='true'">
<xsl:value-of select="@key"></xsl:value-of>
<xsl:text>=</xsl:text>
<xsl:value-of select="@value"></xsl:value-of>
<xsl:text>&#xA;</xsl:text>
</xsl:if>
</xsl:if>
</xsl:if>
</xsl:for-each>

Und obwohl ich hier vorher varName teste, geht es in die nächste Anweisung, welche mir dann bei nicht vorhandensein eine Exception schmeißt, verstehen tue ich das nicht! :confused:

Der_Donnervogel
2006-06-29, 13:47:57
Auf den ersten Blick seh ich da auch keinen Fehler. Eigentlich dürfte er da wirklich nicht reingehen, wenn varName leer ist. Vielleicht mal probieren, das if leicht zu variieren und zB die Prüfung auf

<xsl:if test="string-length($varName) &gt; 0">

zu ändern, oder vielleicht mal den test mit xsl:choose machen. :confused:

PHuV
2006-06-29, 14:26:57
Alle Abfragen vorher bringen rein gar nichts, das XSLT rutscht immer in die kritische Anweisung.

Ich hab den Fehler!
xsl:variable initialisert am Anfang nicht, deshalb die Exception, weil diese Variable keinen Inhalt hat.

Wenn man statt

<xsl:variable select="@key" name="varName"/>

nun param verwendet

<xsl:variable select="@key" name="varName"/>

funktioniert es so, wie es soll, weil param dann varName einen Leerstring als Default gibt, wenn varName keinen Wert enthält (habe ich aus eine XSLT 2.0 Handbuch).

Mensch, darauf muß man erst mal kommen, grr (ich finde XSLT blöd!). Da konnte mir selbst 3 "XSLT Spezialisten" aus unserem Hause nicht helfen.