Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


XPath-Adressierung optionaler Werte

Möchten wir alle "Ort"-Elemente haben, deren Childnode "PLZ" leer oder nicht vorhanden ist, so können wir die folgende Logik nicht(!) verwenden.

 <ergebnis>
  <xsl:for-each 
       select="Orte/Ort[PLZ = '']">
   <PLZ info="{PLZ}">
    <Ort>
     <xsl:value-of select="name" />
    </Ort>
   </PLZ>
  </xsl:for-each>
 </ergebnis>

Das nicht gewünschte Resultat würde lauten:

<ergebnis/>

Der Grund für das fehlerhafte Ergebnis ist, daß XPath hier sämtliche "Ort"-Nodes adressiert, die einen Childnode "PLZ" mit leerem Inhalt haben. Das ist aber nirgendwo der Fall. Der Versuch, einen leeren String mit einer leeren Sequence zu vergleichen, ergibt immer false().

Um das gewünschte Ergebnis

   <ergebnis>
      <PLZ info="">
         <Ort>Neustadt</Ort>
      </PLZ>
      <PLZ info="">
         <Ort>Kapstadt</Ort>
      </PLZ>
   </ergebnis>

zu erhalten, bietet sich folgende Lösung an (Orte/Ort[xs:string(PLZ) = ''] würde nicht funktionieren, siehe hierzu die Erläuterungen zu "string"):

 <ergebnis>
  <xsl:for-each select="Orte/Ort[string(PLZ) = '']">
   <PLZ info="{PLZ}">
    <Ort>
     <xsl:value-of select="name" />
    </Ort>
   </PLZ>
  </xsl:for-each>
 </ergebnis>

... oder alternativ für alle, die gern mit erweiterter Syntax experimentieren:

 <ergebnis>
  <xsl:for-each select="for $yy in 
           Orte/Ort[xs:string(PLZ) = '' or not(PLZ)] 
           return $yy">
   <PLZ info="{PLZ}">
    <Ort>
     <xsl:value-of select="name" />
    </Ort>
   </PLZ>
  </xsl:for-each>
 </ergebnis>

qrpic/optionaleElemente1.jpg

wg / 15. September 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info10@wilfried-grupe.de