juls_pro_37: XSLT 1.0 when

Hi,

ich würde gerne mittels XSLT ein leeres XML erstellen, falls ein bestimmter Wert (ADD_002/IDENTIFIER) ungleich test1 oder ungleich test2 ist. -> Also, wenn ADD_002/IDENTIFIER = test 1 oder test 2 dann ist alles ok -> Wenn ADD_002/IDENTIFIER = test3, dann soll das XML leer sein. (alle Knoten sollen entfernt werden)

XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<SEEDESADV>
	<CNT>
		<GRP>
			<MSG>	
				<ASN>
					<ADD_002>					
						<IDENTIFIER>test3</IDENTIFIER>						
					</ADD_002>				
					<ITEM>
						<ITEM_POS>
							<LINE_ITEM_NUMBER>1</LINE_ITEM_NUMBER>						
						</ITEM_POS>						
					</ITEM>
				</ASN>
			</MSG>
		</GRP>
	</CNT>
</SEEDESADV>

XSLT:

  <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
 
  <xsl:strip-space elements="*" />

    <xsl:template match="/">   
        <xsl:choose>
            <xsl:when test="//ADD_002[IDENTIFIER != 'test1' or != 'test2']"></xsl:when>
                <xsl:otherwise> <xsl:apply-templates select="@* | node()"/></xsl:otherwise>                
        </xsl:choose>
    </xsl:template>
 
</xsl:stylesheet>

Vielen Dank

LG Julian

  1. Hi,

    ich würde gerne mittels XSLT ein leeres XML erstellen, falls ein bestimmter Wert (ADD_002/IDENTIFIER) ungleich test1 oder ungleich test2 ist.

    Also immer?

    Denn wenn identifier == test1 ist, ist es ungleich test2, wenn identifier gleich test2 ist, ist es ungleich test1, und als letzter Fall bleibt noch, daß identifier zu beiden ungleich ist.

    Du willst:

    nicht(identifier == 'test1' oder identifier == 'test2')

    XSLT:

                <xsl:when test="//ADD_002[IDENTIFIER != 'test1' or != 'test2']"></xsl:when>
    

    nach dem or fehlt der Wert, den Du mit != 'test2' vergleichen willst. Wenn das wieder //ADD_002/IDENTIFIER ist, dann muß das nochmal dastehen.

    Und mit / statt [

    Aber wie oben schon gesagt, die Bedingung ist so eh nicht richtig.

    cu,
    Andreas a/k/a MudGuard

    1. also: <xsl:when test="not(//ADD_002/IDENTIFIER = 'test1' or //ADD_002/IDENTIFIER = 'test2')"></xsl:when>?

    2. Hallo MudGuard,

      die Bedingung ist so eh nicht richtig.

      "ungleich diesem oder ungleich jenem" ist umgangssprachlich ein "weder noch", und beim Programmieren fällt man darauf rein.

      Genauer formuliert ist es das, was Du schriebst: NICHT(dies ODER jenes). Und die beiden Logikregeln von De Morgan sagen:

      NICHT(A ODER B)   ⇔   (NICHT A) UND  (NICHT B)  
      
      NICHT(A UND B)    ⇔   (NICHT A) ODER (NICHT B)  
      

      Der Vorschlag von Juls wird wohl gehen, aber im XSLT könnte auch stehen:

      <xsl:when test="//ADD_002[IDENTIFIER != 'test1' and != 'test2']"></xsl:when>
                                                      ^^^
      

      Das setzt jetzt voraus, dass der Rest der Syntax stimmte. Eine Abkürzungsschreibweise
      X != A and != B an Stelle von X != A and X != B ist mir bisher nur in der so genannten „Programmiersprache“ COBOL[1] zugestoßen.

      Rolf

      --
      sumpsi - posui - obstruxi

      1. In Wahrheit ist es eine Kunstsprache, in der man den Literatur-Nobelpreis gewinnen kann ↩︎

      1. @@Rolf B

        Eine Abkürzungsschreibweise X != A and != B an Stelle von X != A and X != B ist mir bisher nur in der so genannten „Programmiersprache“ COBOL zugestoßen.

        JavaScript: ![A, B].includes(X)

        PHP: !in_array($X, [$A, $B])

        😷 LLAP

        --
        „Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“
        — Joachim Gauck über Impfgegner