Hamdi Gezer: Absätze aus XML mit XSL ausgeben

Hallo,

ich möchte Absätze bzw. Zeilenumbrüche aus eine XML-Datei im XSL ausgeben. Dazu habe ich den u. a. Code programmiert. Es klappt leider nicht.

Weißt Jemand vieleicht, wie man Absätze bzw. Zeilenumbrüche vom XML ins XSL integrieren kann.

Vielen Dank für eure Hilfe.

Gruß
Hamdi

XML-Code:

<Tag>
 <Text>
  Das ist ein Text
  <Absatz/>
  mit einem Absatz.
 </Text>
 <Text>
  Das ist ein Text ohne einem Absatz.
 </Text>
</Tag>

XSL-Code:

<xsl:for-each select="document('Text.xml')//Text">
 <p><xsl:value-of select="Text">
  <xsl:if test="Text/Absatz">
   <br/><br/>
  </xsl:if >
 </xsl:value-of></p>
</xsl:for-each>

  1. Hallo,

    ich möchte Absätze bzw. Zeilenumbrüche aus eine XML-Datei im XSL ausgeben. Dazu habe ich den u. a. Code programmiert. Es klappt leider nicht.

    Weißt Jemand vieleicht, wie man Absätze bzw. Zeilenumbrüche vom XML ins XSL integrieren kann.

    value-of ist eine leeres Element, du kannst darin keine Abfragen etc. machen.

    <xsl:template match="Absatz">
      <br/><br/>
    </xsl:template>

    <xsl:template match="Text">
      <p>
        <xsl:apply-templates />
      </p>
    </xsl:template>

    <xsl:for-each select="document('Text.xml')//Text">

    <xsl:apply-templates />

    </xsl:for-each>

    Grüße
    Thomas

    1. Hallo,

      zuerst bedanke ich mich herzlich für deine Antwort.

      Ich muss mein XSL-Code zwischen

      <xsl:for-each select="document('Text.xml')//Text">

      </xsl:for-each>

      einpacken. Da ich meine XML-Datei für mehrere XSL-Dokumente anwenden muss. Wenn ich zwischen "for-each" "xsl:tamplate" anpacke, bekomme ich folgende Meldung:

      "Fehler während der XSLT-Transformation"

      Gibt es eine andere Lösung? Ich darf leider keine Scripte anwenden, die eine Serverunterstützung erwarten, da unsere Hochschulserver diese nicht unterstützt. Bin eigentlich kein Programmierer, vom Behindertenreferent der Hochschule wurde ich darum gebeten eine Homepage zu anfertigen. XSL und XML benötige ich für einen Newssystem. Da die Seite auch für Menschen mit eine Sehschwäche sichbar sein kann, muss ich es in zwei unterschiedlichen Formen darstellen. Damit es für unseren Behindertenreferent praktischer ist, möchte ich den Newssystem mit eine XML-Datei erstellen. Sodass er nur eine XML-Date zuhochladen hat.

      Grüße
      Hamdi

      1. Hallo,

        Ich muss mein XSL-Code zwischen

        <xsl:for-each select="document('Text.xml')//Text">

        </xsl:for-each>

        einpacken. Da ich meine XML-Datei für mehrere XSL-Dokumente anwenden muss. Wenn ich zwischen "for-each" "xsl:tamplate" anpacke, bekomme ich folgende Meldung:

        "Fehler während der XSLT-Transformation"

        Ja, das kannst du nicht machen.
        Aber du brauchst den Kode nicht unbeding in for-each:

        <xsl:template match="Absatz" mode="ausgabe1">
          <br/><br/>
        </xsl:template>

        <xsl:template match="Text" mode="ausgabe1">
          <p>
            <xsl:apply-templates mode="ausgabe1" />
          </p>
        </xsl:template>

        <xsl:for-each select="document('Text.xml')//Text">

        <xsl:apply-templates mode="ausgabe1" />

        </xsl:for-each>

        Grüße
        Thomas

        1. Vielen Dank,

          ich habe es ausprobiert aber es klappt leider nicht. Ich bekomme immer noch den selben Fehlermeldung. Habe den Code meines XSL-Dokuments unten eingefügt. Vieleicht habe ich etwas übersehen.

          Noch einmal Tausend Dank für deine Unterstützung.

          Grüße
          Hamdi

          <?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>
            <meta http-equiv="Content-Type" content="text/html" charset="iso-8859-1" />
            <title>IbS Bochum </title>
            <link rel="stylesheet" type="text/css" href="../../../layout/blau.css"/>
           </head>
          <body>
              <div id="col2news">
           <xsl:template match="Titel" mode="titel">
            <h3><xsl:apply-templates mode="titel" /></h3>
           </xsl:template>
           <xsl:template match="Absatz" mode="text">
            <br/><br/>
           </xsl:template>
           <xsl:template match="Text" mode="text">
            <p><xsl:apply-templates mode="text" /></p>
           </xsl:template>
           <xsl:template match="Datum" mode="date">
            <p><xsl:apply-templates mode="date" /></p>
           </xsl:template>
           <xsl:for-each select="document('Text.xml')//Text">
            <xsl:apply-templates mode="titel" />
            <xsl:apply-templates mode="text" />
            <xsl:apply-templates mode="date" />
           </xsl:for-each>
              </div>
          </body>
          </html>

          </xsl:template>
          </xsl:stylesheet>

          1. Hallo,

            ich habe es ausprobiert aber es klappt leider nicht. Ich bekomme immer noch den selben Fehlermeldung. Habe den Code meines XSL-Dokuments unten eingefügt. Vieleicht habe ich etwas übersehen.

            Ja:

            <?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>
              <meta http-equiv="Content-Type" content="text/html" charset="iso-8859-1" />
              <title>IbS Bochum </title>
              <link rel="stylesheet" type="text/css" href="../../../layout/blau.css"/>
             </head>
            <body>
                <div id="col2news">
             <xsl:for-each select="document('Text.xml')//Text">
              <xsl:apply-templates mode="titel" />
              <xsl:apply-templates mode="text" />
              <xsl:apply-templates mode="date" />
             </xsl:for-each>
                </div>
            </body>
            </html>

            </xsl:template>

            <xsl:template match="Titel" mode="titel">
              <h3><xsl:apply-templates mode="titel" /></h3>
             </xsl:template>
             <xsl:template match="Absatz" mode="text">
              <br/><br/>
             </xsl:template>
             <xsl:template match="Text" mode="text">
              <p><xsl:apply-templates mode="text" /></p>
             </xsl:template>
             <xsl:template match="Datum" mode="date">
              <p><xsl:apply-templates mode="date" /></p>
             </xsl:template>

            </xsl:stylesheet>

            Grüße
            Thomas

            1. Dankeschön,

              Ich bekomme jetzt den Fehler nicht mehr, aber die einzelne XML-Tags werden dreimal hintereinander ausgegeben. Sodass ich dreimal hintereinander den gleichen Inhalt bekomme und danach den nächsten Tag dreimal hintereinander usw.. Außerdem werden die Absätze nicht gezeigt.

              Grüße
              Hamdi

              1. Hallo Hamdi,

                ich habe das jetzt nur kurz überflogen. Gibt es einen Grund, warum ihr es so überaus umständlich hinkriegen wollt? Folgendes sollte doch ausreichen:

                <pre>
                 <xsl:template match="/">
                  <xsl:apply-templates select="document('test_1.xml')//Text"/>
                 </xsl:template>

                <xsl:template match="Text">
                  <p>xsl:apply-templates/</p>
                 </xsl:template>

                <xsl:template match="Absatz">
                  <br/>
                 </xsl:template>
                </pre>

                Gruß Uwe

                1. Hallo,

                  Vielen Dank für deine Unterstützung.

                  Ich habe es ausprobiert und bekomme eine folgendes Fehlermeldung:

                  "Fehler während der XSLT-Transformation:
                         Die XSLT-Transformation ist fehlgeschlagen."

                  Was besagt diese Fehlermeldung und woran könnte ich falsch gemacht haben.

                  Grüße
                  Hamdi

                  1. Hallo Hamdi,

                    »»Was besagt diese Fehlermeldung

                    Tja, die ist relativ nichtssagend :-)
                    Wie sieht denn der Quelltext aus?

                    Gruß Uwe

                    1. Hallo Uwe,

                      »»Was besagt diese Fehlermeldung

                      der Quelltext sieht wie folgt aus:

                      <?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>
                        <meta http-equiv="Content-Type" content="text/html" charset="iso-8859-1" />
                        <title>IbS Bochum</title>
                        <link rel="stylesheet" type="text/css" href="../../../layout/blau.css"/>
                       </head>
                      <body>
                          <div id="col2news">
                        <pre>
                          <xsl:template match="/">
                            <xsl:apply-templates select="document('News.xml')//Nachricht"/>
                          </xsl:template>
                           <xsl:template match="Text">
                            <p>xsl:apply-templates/</p>
                         </xsl:template>
                         <xsl:template match="Absatz">
                          <br/>
                         </xsl:template>
                        </pre>
                       </div>
                      </body>
                      </html>
                      </xsl:template>
                      </xsl:stylesheet>

                      1. Hallo Hamdi,

                        du darfst die Templates nicht ineinander verschachteln.

                        ...

                        <xsl:template match="/">

                        <html>
                         <head>
                          <meta http-equiv="Content-Type" content="text/html" charset="iso-8859-1" />
                          <title>IbS Bochum</title>
                          <link rel="stylesheet" type="text/css" href="../../../layout/blau.css"/>
                         </head>
                        <body>
                            <div id="col2news">

                        <xsl:apply-templates select="document('News.xml')//Nachricht"/>

                        </div>
                        </body>
                        </html>
                        </xsl:template>

                        <xsl:template match="Text">
                              <p>xsl:apply-templates/</p>
                        </xsl:template>

                        <xsl:template match="Absatz">
                            <br/>
                        </xsl:template>

                        ...

                        Gruß Uwe

                        1. Vielen Dank,

                          es klappt jetzt wunderbar. Ich habe nur noch eine kleine Problem. Undzwar ich habe auch URLs in meinem XML:

                          ...
                          <Link>
                              <Url>www.selfhtml.org</Url>
                              <Url-Text>Selfhtml</Url-Text>
                          </Link>
                          ...

                          Der dazugehörige XSL-Teil:

                          ...
                          <xsl:template match="Link/Url-Text">
                           <a>
                            <xsl:attribute name="href">
                             xsl:textmailto:</xsl:text>
                             <xsl:value-of select="Link/Url" />
                            </xsl:attribute>
                            <p><b>xsl:apply-templates/</b></p>
                           </a>
                          </xsl:template>
                          ...

                          Ich möchte, dass nur der URL-Text angezeigt wird, aber der URL wird auch mit gezeigt.

                          Wie kann dieses ich es verhindern?

                          Grüße
                          Hamdi

                          1. Hallo,

                            es klappt jetzt wunderbar. Ich habe nur noch eine kleine Problem. Undzwar ich habe auch URLs in meinem XML:

                            ...
                            <Link>
                                <Url>www.selfhtml.org</Url>
                                <Url-Text>Selfhtml</Url-Text>
                            </Link>
                            ...

                            Der dazugehörige XSL-Teil:

                            ...
                            <xsl:template match="Link/Url-Text">
                            <a>
                              <xsl:attribute name="href">
                               xsl:textmailto:</xsl:text>
                               <xsl:value-of select="Link/Url" />
                              </xsl:attribute>
                              <p><b>xsl:apply-templates/</b></p>
                            </a>
                            </xsl:template>
                            ...

                            Ich möchte, dass nur der URL-Text angezeigt wird, aber der URL wird auch mit gezeigt.

                            Wie kann dieses ich es verhindern?

                            <xsl:template match="Link">
                              <a>
                               <xsl:attribute name="href">
                                xsl:choose
                                 <xsl:when test="contains(Url, '@')">
                                  <xsl:value-of select="concat('mailto:', Url)" />
                                 </xsl:when>
                                 <xsl:when test="starts-with(Url, 'www')">
                                  <xsl:value-of select="concat('http://', Url)" />
                                 </xsl:when>
                                 xsl:otherwise
                                  <xsl:value-of select="Url" />
                                 </xsl:otherwise>
                                </xsl:choose>
                               </xsl:attribute>
                               <b>
                                <xsl:value-of select="Url-Text" />
                               </b>
                              </a>
                             </xsl:template>

                            <p> gehört nicht in einem <a>.

                            Grüße
                            Thomas

                            PS: du hast mich weder gestört, noch geärgert (na ja, zumindest nicht zu sehr ;-) )

                            1. Hallo,

                              Nochmal Tausend Dank für deine Unterstützung.

                              Es klappt jetzt.

                              PS: du hast mich weder gestört, noch geärgert (na ja, zumindest nicht zu sehr ;-) )

                              Es freut mich sehr, dass ich dich nicht zu sehr gestört bzw. geärgert habe :-)

                              Grüße
                              Hamdi

                      2. Hallo,

                        »»Was besagt diese Fehlermeldung

                        <?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="/">

                        <xsl:template match="/">
                              <xsl:apply-templates select="document('News.xml')//Nachricht"/>
                            </xsl:template>
                             <xsl:template match="Text">
                              <p>xsl:apply-templates/</p>
                           </xsl:template>

                        Das ist noch immer/schon wieder derselbe Fehler den du schon vorher hattest.
                        Ich kann mir zwar vorstellen, dass das Einarbeiten im XSL vielleicht nicht so einfach ist und dass du auch unter Druck steht, aber es bringt:
                         - dich keinen Millimeter weiter, wenn du einfach ignorierst worauf man dich hinweist
                        -  diejenigen, die dir zu helfen versuchen auf die Palme (weil man das Gefühl hat, mit Selbsgespräche zu führen)

                        Grüße
                        Thomas

                        1. Hallo Thomas,

                          Es tut mir Leid, wenn ich dich geärgert habe. Ich habe nicht den Absicht gehabt dich zu ärgern. Ich habe nie mit XSL programmiert und habe keine Ahnung davon. Ich versuche mein bestes geben. Ich lerne jeden Tag etwas dazu und heute habe ich auch etwas gelernt.

                          Vielen Dank für deine Unterstützung und es tut mit Leid, falls ich dich gestört habe.

                          Grüße
                          Hamdi