Announcement

Collapse
No announcement yet.

xslt / *.txt to *.html, Theaterstück

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

  • xslt / *.txt to *.html, Theaterstück

    Hallo zusammen

    Für die gekürzte XSLT-Ausgabe einer Textstruktur, habe ich folgendes Theaterstück/input *.txt geschrieben.
    Es soll mir die Möglichkeiten von Konvertierungen per xsl/xpath aufzeigen. (Übungsaufgabe)

    Code:
    Robert Hansen Auftritt um 20:03 eingeübt
    Rolle Bauer, wütender Auftritt
    Robert Hansen 20:03
    Leerzeile
    In Bauers Arbeitsgewand
    Unfrisiert
    kein Geld dabei
    stinkend
    schmutzig
    Nina von der Mühle Auftritt um 20:30 eingeübt
    Rolle PfarrerIn, schlichtender Auftritt
    Nina von der Mühle 20:30
    Leerzeile
    langes Kleid, weite Aermel
    langes offenes Haar
    Bibel oder Gesangsbuch in der Hand
    mahnende Stimme
    Das output-file *.html sollte wie folgt aussehen:

    Code:
    <!-- mit tabelarischer Struktur -->
    <table>
    <tr>
    <td>Robert Hansen 20:03</td>
    <td>
        <dt>In Bauers Arbeitsgewand</dt>
        <dt>Unfrisiert</dt>
        <dt>kein Geld dabei</dt>
        <dt>stinkend</dt>
        <dt>schmutzig</dt>
    </td>
    </tr>
    <tr>
    <td>Nina von der Mühle 20:30</td>
    <td>
        <dl>
        <dt>langes Kleid, weite Aermel</dt>
        <dt>langes offenes Haar</dt>
        <dt>Bibel oder Gesangsbuch in der Hand</dt>
        <dt>mahnende Stimme</dt>
        </dl>
    </td>
    </tr>
    </table>
    Zwischenzeitlich bin ich nun mit der offensichtlich richtigen Formulierung für eine mögliche Teillösung
    schon erheblich weitergekommen.
    In folgendem Link habe ich heute Morgen entscheidende Codefragmente gefunden.

    https://sqa.stackexchange.com/questi...tains-in-xpath

    en: How to find element using contains in xpath.
    de: So finden Sie ein Element mithilfe von enthält in xpath.

    Die Bedingung contains, bietet mir wiederkehrende Vorkommnisse zu lokalisieren.
    Es wird in obigem Link auch aufgezeigt, dass mit "or" ganze Verkettungen hergestellt werden können.

    Wie kann ich via xslt 2.0 oder xslt 3.0 das Input- Dokument Schrittweise zerlegen, bis der verkürzte Output dargestellt ist
    und die nicht benötigten Zeilen unterdrückt sind/nicht aufgerufen werden.
    Das Timestamp \d\d:\d\d sollte bei mehreren Akteuren vorerst erhalten bleiben. (Modellbeispiel)

    Bei zwei Akteuren sind die manuellen Transformationsschritte Suchen/Ersetzen noch überschaubar/realisierbar.
    Mehrere Akteure in diesem Rollenspiel sind denkbar. Ein Akteur kann im zeitlichen Ablauf, mehrere Auftritte haben,
    bis der nächste Akteur in Szene kommt.

    Viele Grüsse aus dem Bayrischen Wald

    Karl_heg
    Zuletzt editiert von Karl_Heg; 02.08.2021, 20:17.

  • #2
    Sieht aus wie eine Gruppierungsaufgabe für for-each-group group-starting-with, um die dt/dd-Paare zu konstruieren. Ich habe allerdings überhaupt nicht verstanden, wodurch ein dt im Textbeispiel erkannt werden soll. Und vielleicht sollte man lieber die 10 Minuten investieren, um ein strukturiertes Textformat zu schreiben, als erst mit unstrukturiertem Text anzufangen, um den dann per Hand oder RegEx oder XSLT wieder zu strukturieren.

    Comment


    • #3
      Hallo Martin

      Glücklicherweise habe ich heute Morgen endlich die richtige Formulierung gefunden und bin aktuell fleissig am testen.
      Natürlich hast Du recht, dass man sich im Alltag mit solchen Strukturen nicht bemühen sollte.
      Auch Dein Ansatz mit for-each-group...., werde ich testen.
      Du hast mir ja schon aufgezeigt, wie man in einem Zuge alle Aufgaben durchziehen kann.
      Kurzum, habe ich nach Deiner Anregung den obigen Beitrag gekürzt und angepasst.
      Das Manuskript, muss ich zu gunsten der Transformationen, möglicherweise weiter optimieren.
      Klare Erkennungsmerkmale in den Akteur/Zeilen.

      Bis dahin verbleibe ich bis ich den ersten gangbaren Ansatz gefunden habe.

      Viele Grüsse aus dem Bayrischen Wald

      Karl_heg

      Comment


      • #4
        Wodurch wird denn die Struktur definiert, immer 3 Einleitungzeilen (von denen die ersten beiden dann nicht ausgegeben werden) zu einem Darsteller, dann eine Leerzeile, dann die dazu gehörenden Beschreibungszeilen?

        Comment


        • #5
          Mittels XQuery 3.1 und "tumbling window" wird z.b. aus
          Code:
          declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
          
          declare option output:method 'html';
          declare option output:html-version '5';
          
          declare variable $text as xs:string external := ``[Robert Hansen Auftritt um 20:03 eingeübt
          Rolle Bauer, wütender Auftritt
          Robert Hansen 20:03
          
          In Bauers Arbeitsgewand
          Unfrisiert
          kein Geld dabei
          stinkend
          schmutzig
          Nina von der Mühle Auftritt um 20:30 eingeübt
          Rolle PfarrerIn, schlichtender Auftritt
          Nina von der Mühle 20:30
          
          langes Kleid, weite Aermel
          langes offenes Haar
          Bibel oder Gesangsbuch in der Hand
          mahnende Stimme]``;
          
          
          document {
          <html lang="de">
              <head>
                <title>.NET XQuery 3.1 Fiddle</title>
              </head>
              <body>
              <dl>{
                  let $lines := tokenize($text, '\n')
                  for tumbling window $actor in $lines
                  start at $pos when $lines[$pos + 3] = ''
                  return (
                      <dt>{$actor[3]}</dt>,
                      subsequence($actor, 5) ! <dd>{.}</dd>
                  )
              }</dl>
              </body>
            </html>
          }
          das Resultat
          Code:
          <!DOCTYPE HTML><html lang="de">
             <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                <title>.NET XQuery 3.1 Fiddle</title>
             </head>
             <body>
                <dl>
                   <dt>Robert Hansen 20:03</dt>
                   <dd>In Bauers Arbeitsgewand</dd>
                   <dd>Unfrisiert</dd>
                   <dd>kein Geld dabei</dd>
                   <dd>stinkend</dd>
                   <dd>schmutzig</dd>
                   <dt>Nina von der Mühle 20:30</dt>
                   <dd>langes Kleid, weite Aermel</dd>
                   <dd>langes offenes Haar</dd>
                   <dd>Bibel oder Gesangsbuch in der Hand</dd>
                   <dd>mahnende Stimme</dd>
                </dl>
             </body>
          </html>
          https://xqueryfiddle.liberty-development.net/94hwpi6

          XQuery 3.1 wird wie XSLT 3.0 z.b. von Saxon 9 oder 10 oder von Altova unterstützt, sowie von BaseX.

          Im Beispiel habe ich den Text als externe Variable deklariert und dann direkt im Beispiel eingefügt, dass aber nur, um das Beispiel vollständig und ausführbar zu halten, ansonsten kann man natürlich unparsed-text oder unparsed-text-lines mit einer Textdatei verwenden.

          Comment


          • #6
            Wodurch wird denn die Struktur definiert......
            Im Falle Theaterstück, können wir es vorerst bei 3 Zeilen belassen. (3 Akteurzeilen, 1 Leerzeile, mindestens eine oder beliebig viele Input- Zeilen)
            Für globale Anwendungen, sehe ich die Zeilen wie folgt definiert.
            Bsp: (Modell/mögliches Szenario)
            Zeile 0: Head 0 Timestamp täglich/wöchentlich/monatlich! Dienstag | Mittwoch etc. Januar | Februar etc. | Date/Time
            Zeile 1: Head 1 Hauptsignatur, preceding::*[1] from Head 2 (Theater: Robert Hansen Auftritt um 20:03 eingeübt)
            Zeile 2: Head 2 (gilt als Leaderzeile mit einer unverkennbaren Signatur), (Theater: Zeile 2: starts-with "Rolle") Localization steps Forward Backward!
            Zeile 3: Head 3 Short information chain (Nina von der Mühle 20:30) following::*[1] from Head 2
            Zeile 4: Head 4 Empty dividing line, given or optional, following::*[2] from Head 2
            Zeile 5: input 1 any input (minimum one), not head
            Zeile 6: input 2 any input (optional), not head
            Zeile 7: input 3 any input (optional), not head
            etc., not head

            Comment


            • #7
              Hallo Martin

              Vorab grossen herzlichen Dank!
              Mit JG 1958, muss man anerkennen dass die Technik an einem vorbeirauscht.
              Dein Ansatz bei xqueryfiddle.liberty (xquery 3.1), hat mich echt verblüfft!
              Meine to do- Liste ist nun noch grösser geworden. (regex, xslt, xpath, xquery)

              Viele Grüsse aus dem Bayrischen Wald

              Karl_heg
              Zuletzt editiert von Karl_Heg; 03.08.2021, 18:17.

              Comment

              Working...
              X