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


CSV validieren mit XSLT 3.0

Zusammenfassung:

Die Valdierung von CSV-Dateien ist auch in XSLT 2.0 und XSL 3.0 möglich.

CSV validieren mit XSLT 3.0

Das unten dargestellte Beispiel spricht jede Zeile (natürlich wieder ohne Headerzeile) einer CSV-Datei an und prüft dieses mit xsl:analyze-string und dem dort definierten regex-Attribut. Entspricht die Zeile dem Pattern, so wird sie in einem <korrekt>-Element dargestellt, andernfalls mit einem <fehlerhaft>-Element.

Freilich akzeptiert der von mir verwendete XSLT-Prozessor nicht die geschweiften Klammern "{}", die als Quantifizierer für wiederholte Aufrufe fungieren:

<xsl:variable name="csvdatei" select="'C:/wg/csv.txt'"/>
<xsl:template name="csvvalidate">
 <xsl:element name="ERG">
  <xsl:for-each 
     select="unparsed-text-lines($csvdatei)[position() &gt; 1]">
   <xsl:variable name="pos" select="position()" />   
   <xsl:analyze-string 
     regex="^[0-9]+;[A-Z][a-z]+;[A-Z][a-z]+;[0-9]+(\.[0-9][0-9])?$" 
     select=".">
    <xsl:matching-substring>
     <korrekt zeile="{$pos}">
      <xsl:value-of select="." />
     </korrekt>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
     <fehlerhaft zeile="{$pos}">
      <xsl:value-of select="." />
     </fehlerhaft>
    </xsl:non-matching-substring>
   </xsl:analyze-string>
  </xsl:for-each>
 </xsl:element>
</xsl:template>

Um bewußt fehlerhafte Ergebnisse zu produzieren, habe ich mit einem modifizierten Pattern gearbeitet, das die optionalen Nachkommastellen der letzten Zahl unterbindet (".56" wäre also falsch).

^[0-9]+;[A-Z][a-z]+;[A-Z][a-z]+;[0-9]+$

"Bewaffnet" mit diesem Pattern, erhalte ich das erwartete Ergebnis:

<ERG>
  <fehlerhaft zeile="1">1;Holzflos;Hugo;234.56</fehlerhaft>
  <fehlerhaft zeile="2">4;Nixlos;Nicole;1234.56</fehlerhaft>
  <korrekt zeile="3">9;Sprachlos;Stefan;5430</korrekt>
  <fehlerhaft zeile="4">2;Sagblos;Stefan;321.45</fehlerhaft>
  <fehlerhaft zeile="5">3;Sorglos;Siggi;987.58</fehlerhaft>
  <fehlerhaft zeile="6">7;Herzlos;Heini;654.21</fehlerhaft>
  <fehlerhaft zeile="7">8;Rhodos;Rudi;333.33</fehlerhaft>
  <korrekt zeile="8">15;Kolos;Karl;456</korrekt>
  <fehlerhaft zeile="9">16;Sinnlos;Simone;876.54</fehlerhaft>
  <fehlerhaft zeile="10">17;Hirnlos;Horst;546.77</fehlerhaft>
  <fehlerhaft zeile="11">18;Wertlos;Werner;777.77</fehlerhaft>
  <korrekt zeile="12">19;Lustlos;Ludwig;357</korrekt>
  <korrekt zeile="13">5;Wasistlos;Willi;6789</korrekt>
  <korrekt zeile="14">10;Ruhelos;Rita;234</korrekt>
  <korrekt zeile="15">11;Schlaflos;Susi;321</korrekt>
  <korrekt zeile="16">12;Rielos;Lotte;456</korrekt>
  <korrekt zeile="17">6;Bodenlos;Betty;3450</korrekt>
  <korrekt zeile="18">13;Muehelos;Martin;222</korrekt>
  <korrekt zeile="19">14;Leinenlos;Liane;135</korrekt>
</ERG>

qrpic/CSV_validate_XSLT.jpg

wg / 14. Oktober 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