Announcement

Collapse
No announcement yet.

Mehrere Nicht-XML Dokumente einlesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #31
    Sehr schön! Bin auf jeden Fall noch einen Schritt weiter!!

    Muss jetzt noch die Fälle abfangen, wo

    1) zwei zusammengehörende Angaben in einer Zeile stehen und durch ein Semikolon getrennt sind.
    Code:
    Farbe; Blau
    Soll auch in einem <ausgabe> Tag angegeben werden.

    2) nach der Angabe steht kein Semikolon und kein Ausrufezeichen kann ich wohl bei der Vorverarbeitung damit abfangen:
    Code:
    <xsl:when test="fn:contains(.,' ') and not(fn:contains(.,';') or fn:contains(.,'!'))">
    	<xsl:value-of select="fn:concat(.,';')"/>
    </xsl:when>
    Tut mir leid, dass sich immer mehr Fälle ergeben, aber das stelle ich auch erst im Verlauf der zahlreichen Tests fest...

    Vielen Dank!

    Comment


    • #32
      Was wäre die Notation für beliebig viele Leerzeichen? Wie gesagt, die Abstände können beliebig groß sein...
      Um den eben beschriebenen Punkt 1 abzufangen, könnte ich fragen, ob zwischen einem ";" und einem "!" bzw. nach einem ";" noch was kommt, was kein "!" ist. Das wäre ja dann der Fall "Farbe; Blau ! Comments". Dann müsste nur der String vor ";" und der durchgehende String danach getrennt durch ein Leerzeichen miteinander und danach ein ";" gesetzt werden...

      Damit dürfte auch der Rest zum vorgegebenen Muster passen.

      Beliebig viele Leerzeichen: \s* ?

      Vielen Dank!

      PS.: Versuche gerade unterschiedliche Variationen aus, aber so perfekt ist das noch immer nicht...
      Zuletzt editiert von w_ing; 26.01.2010, 12:35.

      Comment


      • #33
        Beispiel

        In diesem Beipspiel müsste eigentlich alles vorgekommen sein :-))

        Code:
        Start;                              
            Farbe S1 S2;                 ! Bla   
            Modell A3 A4;                  ! Bla
            Anzahl 1K 2K                  ! Blub
                                            ! Bla 
                                            ! Blub
        Abteilung U8;                         
            Mitarbeitereinteilung  2.0  2.0 3.0;                
            Pausen 104.;                         
            Sonstiges XYZ;                          
            Notieren                        
        
        Abteilung U9;                         
            Mitarbeitereinteilung 3.0 3.0 0.0;                
            Pausen 4;                         
            Sonstiges                           
        
        Farbe; Blau                         ! Comments
        
        Farbänderung; Farbe M 4                 ! Änderung der Farbe
                                            ! Die erste Angabe soll überschrieben werden...
           
        
        QUIT
        Fast alles davon wird durch die bis jetzt vorhandenen Abfragen richtig einsortiert... In dem rotmarkierten Bereich steht "Sonstiges" komischerweise in einer Zeile mit "Farbe" und "Blau" in der nächsten Zeile zusammen mit "Farbänderung"...

        Comment


        • #34
          Wenn unterschiedliche Möglichkeiten vorkommen, dann gehe die Ausgangszeilen (vor der Suche nach Start | QUIT) mittels regulärem Ausdruck und fn:replace() durch. Dieser Ausdruck müsste grob skizziert so aussehen: (\s*)(\w*)(;?)(\w*)(\w*)(;?)(\s*)(\!?)(\s*)(\w*)
          Im Ersetzungstext lassen sich die einzelnen (...)-Gruppen über $1 bis $n ansprechen und ggf. auch weglassen, hier etwa $1 und $8 bis $10. In diesem Thread habe ich die Nutzung von fn:replace() mit RegEx gezeigt. Baue also einen einheitlichen String auf, der sich mit den bereits beschriebenen Techniken weiter parsen lässt.

          Comment


          • #35
            Ok. Vielen Dank für die zahlreichen Hinweise und Komplettlösungen, Thomas!

            Das hat mir auf jeden Fall sehr geholfen!!

            Ich werde es weiter probieren zu verbessern. Stelle die Ergebnisse hier rein...

            Grüße
            Alex

            Comment


            • #36
              Originally posted by Thomas Meinike View Post
              Einen direkten Weg zum Laden aller *.xml sehe ich nicht, aber z. B. mittels dir *.xml /B > files.txt lässt sich die Dateiliste vorab erzeugen und dann wiederum über unparsed-text() einlesen.
              Was spricht gegen fn:collection() bzw. <xsl:for-each
              select="collection('file:///c:/input-dir/?select=*.xml')/>? Saxon bietet ein paar Optionen (siehe http://www.saxonica.com/documentatio...IResolver.html)

              Falls die eingelesenen Dateien zu groß für den Speicher sind, gibt es hier einen Tipp.

              Eine Methode zum Erstellen eines Verzeichnis-Listings suche ich aber auch, ich werde wohl bei Java enden.

              Comment


              • #37
                Wenn fn:collection() (jetzt) funtioniert, spricht natürlich nichts dagegen. Ich habe damit -- vermutlich mit den ersten XSLT 2.0-Versionen von AltovaXML (2007/2008) -- Probleme gehabt und die genannte Alternative probiert. Insofern also ein guter Hinweis.

                Nochmal probiert, die Pfadsyntax ist entscheidend:

                AltovaXML 2010:
                fn:collection('X:\Pfad\*.xml')

                Saxon 9.2HE:
                fn:collection('file:///X:/Pfad/?select=*.xml')
                Zuletzt editiert von Thomas Meinike; 27.01.2010, 11:40.

                Comment


                • #38
                  Danke nochmals für den Hinweis.

                  Ich nutze zwar momentan nur eine Trial-Version von Altova 2010. Einen permanent key habe ich ebenfalls nur für die 2008 Version.

                  Aber es ist ein sehr nützlicher Hinweis!

                  Comment


                  • #39
                    AltovaXML 2010 ist ein frei verfügbarer Standalone-Prozessor (AltovaXML.exe), welcher sich sowohl von der Konsole aus, aber auch aus Anwendungen heraus aufrufen lässt (sowie via .NET), z. B. auch nutzbar mit älteren XMLSpy-Versionen über "Extras | Optionen... | XSL | Externes XSL-Transformationsprogramm". Dort eingeben:
                    X:\Pfad_zu\AltovaXML2010\AltovaXML.exe -xslt2 %3 -in %1 -out %2

                    Comment

                    Working...
                    X