Announcement

Collapse
No announcement yet.

Benutzerspezifische Seite

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

  • Benutzerspezifische Seite

    Hallo zusammen,

    bin leider in diesem Forum bisher zu keiner Lösung gekommen.
    Folgendes Problem:

    Ich habe 3 Dateien;
    eine XML Datei (Sprachdatei), die zu verschiedenen festgelegten Elementen die jeweilige benutzerspezifische Übersetzung in Attributen ablegt

    ein xsl file, die das Stylesheet für das Basis XML-File bildet

    ein XML-File, was den Inhalt der Website beschreibt


    Nun folgendes: Das XML-File wird zusammen mit dem XSL-File zu einer HTML-Site transformiert.

    Wie binde ich nun die Sprachdatei ein, damit bestimmte Abschnitte/Wörter in Texten ersetzt werden. Der Standardtext kann in manchen Bereichen nämlich durch den Benutzer geändert werden (dies steht in der Sprachdatei)

    Habe da eventuell an die replace Funktion gedacht aber noch keine Erfolge erzielt. Die abschnitte, die im Text verändert werden können, müssen sicherlich mit Variablen belegt werden und weiter?

    Ich hoffe ich rede kein spanisch und mich hat hier jemand verstanden.


    Vielen Dank im voraus!

    Gruß,
    curie

  • #2
    zeig ein wenig code

    Comment


    • #3
      Ok, ich versuchs mal:

      Sprachdatei:
      Code:
      <?xml version="1.0" encoding="utf-8"?>
      <Eintrag Original="Buchtitel" Benutzer="Titel" />
      <Eintrag Original="Autor" Benutzer="Schriftsteller" />
      XSL-File:
      Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" encoding="iso-8859-1" 
                  doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" />
      <xsl:template match="buchliste">
        <html><head>
        <title>Ausgabe</title></head>
        <body>
       <table border="2" style="position:absolute; left:50px; top: 50px; 
                                border-style:outset">
       <tr style="font-weight:bold">
        <td>Buchtitel</td>
        <td>Autor</td>
        <td>Verlag</td>
        <td>Seitenzahl</td>
        <td>ISBN</td>
        <td>Preis</td>
       </tr>
       <xsl:for-each select="buch">
        <xsl:sort select="autor" order="ascending"/>
        <tr>
        <td>
         <div style="color:blue; font-size:10pt; font-family: Arial">
          <xsl:value-of select="titel"/>
         </div>
        </td>
        <td>
         <div style="color:blue; font-size:10pt; font-family: Arial">
          <xsl:value-of select="autor"/>
         </div>
        </td>
        <td>  
         <div style="color:blue; font-size:10pt; font-family: Arial">
          <xsl:value-of select="verlag"/>
         </div>
        </td>
        <td>  
         <div style="color:blue; font-size:10pt; font-family: Arial">
          <xsl:value-of select="seitenzahl"/>
         </div>
        </td>
        <td>  
         <div style="color:blue; font-size:10pt; font-family: Arial">
          <xsl:value-of select="isbn"/>
         </div>
        </td>
        <td>  
         <div style="color:blue; font-size:10pt; font-family: Arial">
          <xsl:value-of select="preis"/>
         </div>
        </td>
        </tr>
       </xsl:for-each>
       </table>
       </body></html>
      </xsl:template>
      </xsl:stylesheet>
      XML-File:
      Code:
      <?xml version="1.0" encoding="ISO-8859-1"?>
      <buchliste>
      <buch>
        <titel>Eclipse</titel>
        <autor>Michael Seeboerger-Weichselbaum</autor>
        <verlag>mitp</verlag>
        <seitenzahl>400</seitenzahl>
        <isbn>3-499-61233-X</isbn>
        <preis>24,95 EUR</preis>
       </buch>
      <buch>
        <titel>Ajax</titel>
        <autor>Michael Seeboerger-Weichselbaum</autor>
        <verlag>mitp</verlag>
        <seitenzahl>250</seitenzahl>
        <isbn>973-3-8266-1762-1</isbn>
        <preis>12,95 EUR</preis>
       </buch>
      <buch>
        <titel>JSP - Das Kompendium</titel>
        <autor>Michael Seeboerger-Weichselbaum</autor>
        <verlag>Markt+Technik</verlag>
        <seitenzahl>1000</seitenzahl>
        <isbn>3-8272-6300-X</isbn>
        <preis>49,95 EUR</preis>
       </buch>
      <buch>
        <titel>Java</titel>
        <autor>Michael Seeboerger-Weichselbaum</autor>
        <verlag>mitp</verlag>
        <seitenzahl>3000</seitenzahl>
        <isbn>973-3-8266-7438-3</isbn>
        <preis>12,95 EUR</preis>
       </buch>
      </buchliste>
      Das ergibt hier eigentlich keinen Sinn aber das Prinzip ist dargestellt. In der Sprachdatei stehen unter Benutzer die veränderten Namen. Diese sollen bei der Transformation automatisch die alten Namen ersetzen. Der Tabellenkopf wäre also in diesem Fall teilweise verändert.


      Grüße

      Comment


      • #4
        Was du als Sprachdatei gepostet hast, ist noch nicht mal ein XML-Dokument, es fehlt zumindest ein Wurzelelement.
        Und was genau soll ersetzt werden? In der einen Datei steht ein Attributwert "Autor", in der anderen Elemente mit Namen "autor", das passt also noch nicht mal von der Schreibweise.
        Poste mal zu den Beispieleingabedokumenten die zugehoerige Ausgabe, die durch XSLT erstellt werden soll, dann wird es eventuell klarer, was passieren soll.

        Comment


        • #5
          zweiter Versuch

          Ja, sorry - schlecht erklärt mit Fehlern (bin auch noch Neuling).

          Again:

          Hier die Sprachdatei:
          Code:
          <?xml version="1.0" encoding="utf-8"?>
          <Trans>
          <Eintrag Original="Buchtitel" />
          <Eintrag Original="Autor" Benutzer="Schriftsteller" />
          </Trans>
          XSL:
          Code:
          <xsl:template match="Beispiel">
          	<p><xsl:apply-templates/></p>
          </xsl:template>
          XML:
          Code:
          <?xml version="1.0" encoding="UTF-8"?>
          <Beispiel>
          Erwin meint, der Autor von diesem Buch sei Goethe. Der Buchtitel lautet Faust.
          </Beispiel>
          Frage bzw. Ergebnis:
          Nach der Transformation soll ein HTML File rauskommen, easy. Nur wie integriere ich die Sprachdatei und bringe XSL bei, dass er vor der Umwandlung schaut, ob ein anderes Wort für, in diesem Fall Schriftsteller definiert wurde.

          Der Text lautet am Ende:
          Erwin meint, der Schriftsteller von diesem Buch sei Goethe. Der Buchtitel lautet Faust.



          Hoffentlich ist es jetzt ein wenig klarer geworden.
          Danke und Grüße!
          curie.

          Comment


          • #6
            Mit XSLT 2.0 (implementiert u.a. von Saxon 9 http://saxon.sourceforge.net/ und AltovaXML Tools http://www.altova.com/altovaxml.html) kann man das folgendermassen angehen:
            Code:
            <xsl:stylesheet
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              version="2.0"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              exclude-result-prefixes="xs">
              
              <xsl:param name="trans-file" as="xs:string" select="'sprachdatei.xml'"/>
              <xsl:variable name="trans-doc" as="document-node()" select="doc($trans-file)"/>
              
              <xsl:variable name="exp" as="xs:string" select="string-join(doc($trans-file)/Trans/Eintrag[@Benutzer]/@Original, '|')"/>
              
              <xsl:key name="k1" match="Eintrag[@Benutzer]" use="@Original"/>
              
              <xsl:template match="Beispiel">
                <p>
                  <xsl:analyze-string select="." regex="{$exp}">
                    <xsl:matching-substring>
                      <xsl:value-of select="key('k1', ., $trans-doc)/@Benutzer"/>
                    </xsl:matching-substring>
                    <xsl:non-matching-substring>
                      <xsl:value-of select="."/>
                    </xsl:non-matching-substring>
                  </xsl:analyze-string>
                </p>
              </xsl:template>
              
            </xsl:stylesheet>
            Zumindest in dieser einfachen Version wird aber dann auch innerhalb von Worten, die "Autor" enthalten, dieses durch "Schriftsteller" ersetzt. Mit AltovaXML Tools kann man den Code verbessern:
            Code:
            <xsl:stylesheet
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              version="2.0"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              exclude-result-prefixes="xs">
              
              <xsl:param name="trans-file" as="xs:string" select="'test2011011104.xml'"/>
              <xsl:variable name="trans-doc" as="document-node()" select="doc($trans-file)"/>
              
              <xsl:variable name="exp" as="xs:string" select="concat('\b(', string-join(doc($trans-file)/Trans/Eintrag[@Benutzer]/@Original, '|'), ')\b')"/>
              
              <xsl:key name="k1" match="Eintrag[@Benutzer]" use="@Original"/>
              
              <xsl:template match="Beispiel">
                <p>
                  <xsl:analyze-string select="." regex="{$exp}">
                    <xsl:matching-substring>
                      <xsl:value-of select="key('k1', ., $trans-doc)/@Benutzer"/>
                    </xsl:matching-substring>
                    <xsl:non-matching-substring>
                      <xsl:value-of select="."/>
                    </xsl:non-matching-substring>
                  </xsl:analyze-string>
                </p>
              </xsl:template>
              
            </xsl:stylesheet>

            Comment


            • #7
              Vielen Dank!
              Hast du es ausprobiert? Ich kriege leider Fehlermeldungen, u.a. bei "as" und analyze-string. Arbeite mit Visual Studio.

              Das zweite Beispiel funktioniert nur unter Altova?



              Schönen Gruß,
              curie

              Comment


              • #8
                Ich habe deutlich gemacht, dass es sich um XSLT 2.0 handelt und habe auch Links auf zwei XSLT 2.0 Prozessoren gepostet. Beide lassen sich mit auch mit Visual Studio nutzen aber wenn du versucht hast, den XSLT 2.0 Code mit Microsoft's MSXML oder XslCompiledTransform in Visual Studio zu nutzen, die nur XSLT 1.0 unterstützen, dann wirst du in der Tat nur Fehlermeldungen bekommen. Also noch mal zur Klärung: von XSLT gibt es seit 1999 die Version 1, seit 2007 die Version 2. Der von mir gepostete Code ist ein XSLT 2.0 Stylesheet, der dann auch nur mit einem XSLT 2.0 Prozessor funktioniert. Das zweite Beispiel funktioniert nur mit AltovaXML Tools, das \b dort unterstützt wird, obwohl die XSLT/XPath 2.0 Spezifikationen dieses nicht definieren.

                Comment


                • #9
                  Super, es funktioniert! Zumindest Lösung 1, die Zweite bessere Lösung ist mir lieber aber setzt leider Altova voraus. Da muss ich mich nochmal umhören.
                  Jetzt muss ich nur noch den Code verstehen, ich probiers mal.

                  Kannst du mir abschliessend noch eine gute Quelle nennen, mit der ich gut XML/XSLT lerne (dieser Forum hier ist natürlich immer eine gute Anlaufstelle).
                  Vielleicht hast du einen Literaturtip.


                  Vielen Dank!

                  Comment


                  • #10
                    Möglichkeiten

                    Um das Thema noch nicht zu beenden...

                    Gibt es noch weitere Möglichkeiten?
                    Ist diese Methode sinnvoll, wenn die Sprachdatei ca. 10.000 Einträge enthält?
                    Vermutlich Buffer Overflow!



                    Danke und schönes Wochenende,
                    curie

                    Comment


                    • #11
                      Die Stärken von XML und XSLT/XPath kommen am besten zur Geltung, wenn man in der Eingabedatei nicht einfach Text verwendet, sondern alle die Worte, die ausgetauscht werden sollen, selbst in Markup packt bzw. per Markup auszeichnet, also etwa
                      Code:
                      <Beispiel>
                      Erwin meint, der <translate>Autor</translate> von diesem Buch sei Goethe. Der Buchtitel lautet Faust.
                      </Beispiel>
                      dann kann man in XSLT einfach ein Template für diese Elemente schreiben:
                      Code:
                        <xsl:param name="trans-file" as="xs:string" select="'sprachdatei.xml'"/>
                        <xsl:variable name="trans-doc" as="document-node()" select="doc($trans-file)"/>
                      
                        <xsl:key name="k1" match="Eintrag[@Benutzer]" use="@Original"/>
                      
                        <xsl:template match="translate">
                           <xsl:value-of select="key('k1', ., $trans-doc)/@Benutzer"/>
                        </xsl:template>
                      Ob der andere Ansatz mit dem regulären Ausdruck und 10000 Einträgen noch verlässlich und performant funktioniert, muss man ausprobieren.

                      Comment

                      Working...
                      X