XSL als: test met meerdere testomstandigheden

[Opgelost]

Dankzij @IanRoberts moest ik de functie normalize-space op mijn nodes gebruiken om te controleren of ze leeg waren.

<xsl:if test="((node/ABC!='') and (normalize-space(node/DEF)='') and (normalize-space(node/GHI)=''))">
  This worked perfectly fine.
</xsl:if>

[Probleem]

Ik probeer een xsl-voorwaarde te maken om te controleren of combinaties van knooppunten leeg zijn of niet. Ik heb onderstaande voorwaarden geprobeerd, maar ze werken niet, heeft iemand een idee hoe ik het werkend kan krijgen

<xsl:if test=" node/ABC!='' and node/DEF='' and node/GHI='' ">
This does not work
</xsl:if>

Ik heb het ook geprobeerd

<xsl:when test="((node/ABC!='') and (node/DEF='') and (node/GHI=''))">
This does not work either..
</xsl:when>

En ook geprobeerd

<xsl:if test="(node/ABC!='')>
<xsl:if test="(node/DEF='')>
<xsl:if test="(node/GHI='')">
Nope not working..
</xsl:if>
</xsl:if>
</xsl:if>

Ik heb het toen geprobeerd met enkele xsl:if-voorwaarden, en hieronder is de observatie

<xsl:if test="node/ABC!=''>
**This is working fine**
</xsl:if>

Als ik echter probeer te zoeken naar een lege voorwaarde, bijv.

<xsl:if test="node/ABC=''>
**This does not work**
</xsl:if>

Ook als ik het probeer met een == (dubbel gelijk aan), dan geeft het een xslt-fout. d.w.z.

<xsl:if test="node/ABC==''>
***This gives a compilation error***
</xsl:if>

Ik zou graag hulp willen bij het uitzoeken hoe ik mijn xsl:if-test kan laten werken om te controleren op meerdere voorwaarden. Bij voorbaat dank.

[Bewerken] : Even om hier te updaten dat de if-voorwaarde waarbij alle knooppunten niet leeg zijn, werkt, het werkt niet wanneer ik probeer te controleren op een ander knooppunt van de drie knooppunten die leeg zijn.

Voor bijvoorbeeld:

<xsl:if test=" node/ABC!='' and node/DEF!='' and node/GHI!='' ">
This condition works perfectly fine.
</xsl:if>

Antwoord 1, autoriteit 100%

Dankzij @IanRoberts moest ik de functie normalize-space op mijn nodes gebruiken om te controleren of ze leeg waren.

<xsl:if test="((node/ABC!='') and (normalize-space(node/DEF)='') and (normalize-space(node/GHI)=''))">
  This worked perfectly fine.
</xsl:if>

Antwoord 2, autoriteit 7%

Probeer de functie empty()te gebruiken:

<xsl:if test="empty(node/ABC/node()) and empty(node/DEF/node())">
    <xsl:text>This should work</xsl:text>
</xsl:if>

Dit identificeert ABCen DEFals leeg in de zin dat ze geen onderliggende knooppunten hebben (geen elementen, geen tekstknooppunten, geen verwerkingsinstructies, geen opmerkingen) .

Maar, zoals aangegeven door @Ian, je elementen zijn misschien niet echt leeg of dat is misschien niet je werkelijke probleem – je hebt niet laten zien hoe je invoer-XML eruit ziet.

Een andere oorzaak van fouten kan uw relatieve positiein de boomstructuur zijn. Deze manier om voorwaarden te testen werkt alleen als de omringende sjabloon overeenkomt met het bovenliggende element van nodeof als u het bovenliggende element van nodeherhaalt.


Antwoord 3, autoriteit 7%

Voor de volledigheid en degenen die niet op de hoogte zijn heeft XSL 1 gekozen voor meerdere voorwaarden.

<xsl:choose>
 <xsl:when test="expression">
  ... some output ...
 </xsl:when>
 <xsl:when test="another-expression">
  ... some output ...
 </xsl:when>
 <xsl:otherwise>
   ... some output ....
 </xsl:otherwise>
</xsl:choose>

Other episodes