XPath-Adressierung optionaler Werte

XPath-Adressierung optionaler Werte

Bei der Arbeit mit optionalen Elementen / optionalen Attributen können Programmierfehler zu Informationsverlust führen.

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>

wg / 7. November 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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: info2018@wilfried-grupe.de

www.wilfried-grupe.de/optionaleElemente1.html