buergle: xml /xsl...Darstellung in Tabelle mit 2 Spalten - aber wie?

Tach!

Ich bin noch recht unerfahren was xml und xsl angeht.
Ich möchte einen Text aus einem xml-tag in eine HTML-Tabelle schreiben, verwende zum konvertieren Saxon.
Dieser Text soll aber nicht in eine einzige Tabellenspalte geschrieben werden, sondern sollte etwa ab der der Hälfte in einer  weiteren Tabellenspalte weiterlaufen.

Ich meine in der Art:

Ausgangstext:"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
soll so in 2 Spalten dargestellt werden:

XXX XXX
XXX XXX
XXX XXX
XXX XXX

Ich mache das bisher nur so:

<xsl:template match="text">
 <p>
 <b>Das Produkt:</b><br/>
  <table border="1" width="200">
  <tr>
  <td>
 <xsl:value-of select="." /> //hier wird der Text derrzeit als ganzes in eine einzige Spalte geschrieben
 </td>
 </tr>
 </table>
 </p>
</xsl:template>

erreiche dadurch also nur, dass der Text so ausgegeben wird:

XXXX
XXXX
XXXX
XXXX
XXXX
XXXX
XXXX
XXXX

Hat jemand eine Idee, was man tun könnte, um obiges zuerreichen?
Freue mich über jeden Tipp.

Dankende Grüße, Buergle

  1. Servus

    so ganz pauschal würde ich behaupten, das geht nicht!
    Wieso auch?
    Ich glaube das grenzt an Tabellenvergwaltigung!? ;op

    bydey

  2. Hallo,

    Ich bin noch recht unerfahren was xml und xsl angeht.
    Ich möchte einen Text aus einem xml-tag in eine HTML-Tabelle schreiben, verwende zum konvertieren Saxon.
    Dieser Text soll aber nicht in eine einzige Tabellenspalte geschrieben werden, sondern sollte etwa ab der der Hälfte in einer  weiteren Tabellenspalte weiterlaufen.

    Hat jemand eine Idee, was man tun könnte, um obiges zuerreichen?
    Freue mich über jeden Tipp.

    Wenn du das erreichen willst muss du etwa folgendes machen:
    Den Text-Inhalt des Elements (also des Knotens den du ausgeben willst) mit string-lenght() abfragen (und ev. in eine Variable speichern).
    Dann schreibst einen Template in dem du mit substring-before() erst die erste Hälfte der mit string-lengt() abgefragten Zeichen ausgibst und dann mit einem substring-after() die zweite hälfte.

    Grüße
    Thomas

    1. hi,

      Wenn du das erreichen willst muss du etwa folgendes machen:
      Den Text-Inhalt des Elements (also des Knotens den du ausgeben willst) mit string-lenght() abfragen (und ev. in eine Variable speichern).
      Dann schreibst einen Template in dem du mit substring-before() erst die erste Hälfte der mit string-lengt() abgefragten Zeichen ausgibst und dann mit einem substring-after() die zweite hälfte.

      geht noch einfacher:
      <?xml version="1.0" encoding="ISO-8859-1" ?>
      <data>
      <anmerkung>
      Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam tincidunt. Nulla sit amet urna in est gravida interdum.
      </anmerkung>
      </data>
      ----------- xsl ----------
      <?xml version="1.0" encoding="ISO-8859-1" ?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
      <html>
      <head>
       <title>Untitled</title>
      </head>

      <body>
       xsl:apply-templates/
      </body>
      </html>
      </xsl:template>

      <xsl:template match="anmerkung">
      <xsl:variable name="zeichen" select="ceiling(string-length() div 2)" />
      <b>Zeichen insgesamt: <xsl:value-of select="string-length()" /></b><br />
      <b>Zeichen erste Hälfte (aufgerundet): <xsl:value-of select="$zeichen" /></b>
       <table width="400" border="1">
        <tr>
         <td><xsl:value-of select="substring(current(), 1, $zeichen)" /></td>
         <td><xsl:value-of select="substring(current(), $zeichen + 1)" /></td>
        </tr>
       </table>
      </xsl:template>
      </xsl:stylesheet>
      -----------------------

      Grüße
      Thomas

      1. Servus Thomas

        Bin mal wieder echt beeindruckt! Träumst Du auch in XSL?
        Ist Dir auch noch der Sinn klar?

        bydey

        1. hi day,

          Bin mal wieder echt beeindruckt! Träumst Du auch in XSL?

          Ja, das passiert mal immer wieder wenn ich über ein Problem zu viel grübele. ;-þ

          Ist Dir auch noch der Sinn klar?

          Wie meinst du das?
          Sinn des Lebens? Das ist 42. Über alles andere läßt sich reden :-)

          Grüße
          Thomas

      2. Hi!
        Herzlichen Dank vorab, ich werds mir genauer anschauen!

        Grüße, Buergle.

      3. Hi Thomas,
        wenn ich das richtig sehe, kann der Text dadurch ungünstig getrennt werden, oder?

        Ich meine, es passiert z.B. sowas:
        Beispiel:"Dieser Text könnte ungünstig getrennt werden."
        Ergäbe in der Tabelle:

        ______________|_________________
                      |
        Dieser Text   |  ünstig getrennt
        könnte ung    |  werden.
                      |
                      |

        Man müsste womöglich noch irgendwie schauen, ob man am Wortende ist?
        Grüße, Buergle.

        1. Servus

          Hi Thomas,
          wenn ich das richtig sehe, kann der Text dadurch ungünstig getrennt werden, oder?

          Ich meine, es passiert z.B. sowas:
          Beispiel:"Dieser Text könnte ungünstig getrennt werden."
          Ergäbe in der Tabelle:

          ______________|_________________
                        |
          Dieser Text   |  ünstig getrennt
          könnte ung    |  werden.
                        |
                        |

          Man müsste womöglich noch irgendwie schauen, ob man am Wortende ist?

          Ich denke da hast recht. Was treibst Du da eigentlich?
          Ich denke es bleibt Dir nichts anderes übrig als:
          1. Feld 1 und 2 fixe Länge, z.B. 10 Buchstaben
          2. n = zeilenlänge/(2*10) = anzahl der benötigten neuen zeilen
          3. for x = 1 to n
          4. ceiling verwenden: ceiling(2x-1) und ceiling(2x) ermitteln
          5. Feld1 = substring ceiling(2x-1)
          6. Feld2 = substring ceiling(2x)
          7. next x

          Hau rein!

          bydey

          1. Hi!

            Man müsste womöglich noch irgendwie schauen, ob man am Wortende ist?

            Ich denke da hast recht. Was treibst Du da eigentlich?

            Ich habe vor, aus einem von Adobe InDesign erstellten Dokument (ein Produkt-Flyer) die Inhalte des Dokuments auf einer Webseite zu veröffentlichen.
            Dies soll aber recht einfach gehen und auch für zukünftige, neue Dokumente schnell erfolgen können.
            Dies erfolgt durch einen xml-Export und dessen Aufbereitung per xsl mit verwendung von Saxon, sodass die Inhalte dem Webseitendesign angepasst werden.
            Genau da dran arbeite ich momentan.
            Zwar ermöglicht InDesign auch einen HTML-Export, doch das Ergebnis ist leider weder syntaktisch noch optisch akzeptabel.

            Sonst treibe ich nix weiteres:)

            Grüße, Buergle.

            1. Servus

              Genau da dran arbeite ich momentan.
              Zwar ermöglicht InDesign auch einen HTML-Export, doch das Ergebnis ist leider weder syntaktisch noch optisch akzeptabel.

              Aber warum 2 Felder????????

              Sonst treibe ich nix weiteres:)

              Schade für Dich!? ;oP

              bydey

        2. Hallo Buergle,

          wenn ich das richtig sehe, kann der Text dadurch ungünstig getrennt werden, oder?

          Ja. Könnte.

          Man müsste womöglich noch irgendwie schauen, ob man am Wortende ist?

          1. es ist sehr gut wenn man sich merkt, dass XSLT keine Programmiersprache ist, bzw. eine Sprache ohne Nebeneffekte.
            (z.B. keine while-Schleife etc.)

          2. Ich mag solche "Vergewaltige mal diese Sprache, damit das Layout hübsch ist"-Aufgaben nicht. Das Web ist nach wie vor kein DTP.

          3. Möglich ist vieles:
            ----------------------
            <?xml version="1.0" encoding="ISO-8859-1" ?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:template match="/">
            <html>
            <head>
             <title>Untitled</title>
            </head>

          <body>
           xsl:apply-templates/
          </body>
          </html>
          </xsl:template>
          <xsl:template match="anmerkung">
                <xsl:call-template name="trennen" />
          </xsl:template>

          <xsl:template name="trennen">
          <xsl:param name="trennzeichen" select="normalize-space(ceiling(string-length() div 2))" />
          <xsl:variable name="naechstezeichen" select="$trennzeichen + 1" />
          <xsl:variable name="leerzeichen" select="substring(current(), $trennzeichen + 1, 1)" />
           xsl:choose
             <xsl:when test="not($leerzeichen = ' ')">
                <xsl:call-template name="trennen">
                   <xsl:with-param name="trennzeichen" select="$naechstezeichen" />
                </xsl:call-template>
             </xsl:when>
             xsl:otherwise
              <table width="400" border="1">
                  <tr>
                   <td><xsl:value-of select="substring(current(), 1, $trennzeichen)" /></td>
                   <td><xsl:value-of select="substring(current(), $trennzeichen + 1)" /></td>
                  </tr>
                </table>
             </xsl:otherwise>
           </xsl:choose>
          </xsl:template>

          </xsl:stylesheet>
          -----------------------

          1. wenn du jetzt noch darauf kommst, dass dann in der ersten Spalte noch Platz für ein oder zwei Wörter blieb und daher noch ein oder zwei Wörter aus der zweite Spalte in die erste kommen sollten: dann darfst du es aber selber machen! ;-)

          Grüße
          Thomas