Fre: xml-datei aus dem internet mit lokaler xsl-datei darstellen

hallo,

ich möchte eine im internet liegende xml datei mit einer xsl datei darstellen, die jedoch auf meinem rechenr liegt. die xml datei im internet kann ich nicht direkt verändern, aber in der xml-datei ist auch keine angabe, das sie mit meiner xsl datei darzustellen ist.

ich habe zwar keinen konkreten code hinbekommen aber habe ein konzept, was ich mir überlegt habe und wie ich das lösen könnte.

ich habe auf meinem rechner eine xml datei, die eine xsl datei ausführt, die wiederum die xml datei in eine neue xml datei mit der angabe der xsl datei, die die eigentliche xml datei darstellen soll. also muss ich ja die xml datei so manipulieren und eine neue xml datei, mit exakt den gleichen inhalt, wie die im internet erzeugen, nur dass sie den tag für die xsl datei hat.

ich hoffe ihr könnt mir da helfen.

danke
Fre

  1. Hallo,

    also eigentlich brauchst du da nichts besonderes, da du dem parser nur mitteilen musst, wo die xml quelle liegt, wo die xsl quelle und wo das Ergebnis abgelegt werden soll. Da du aber nicht schreibst, wie du das ergebnis erzeugen moechtest, muesstest du noch etwas mehr info geben. Wenn du einen lokale xml Datei mit einem lokalen xsl file parsen moechtest, und dann noch die entfernte xml datei einbeziehen moechtest, dann kannst du dass mit document(), nachzulesen hier:
    http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#document

    z.B.

    <xsl:value-of select="document(http://www.absoluter.com/ort/datei.xml)/rootelement/usw/usw/"/>

    du kannst aber auch den ausdruck document(..) als globale variable definieren, dann musst du nicht immer diesen langen ausdruck benutzen.

    Bin mir auch nicht ganz sicher, ob die absolute Adresse in ' ' gesetzt werden muss, etwa so:

    <xsl:value-of select="document('http://www.absoluter.com/ort/datei.xml')/rootelement/usw/usw/"/>

    musst du ausprobieren. Aber so sollte es funktionieren.

    1. also es gibt eine xml datei, die auf einem server im internet liegt. ich hab keinen einfluss auf die xml datei. ich will diese datei mit hilfe von xsl in html umwandeln, sodass man diese datei, grafisch aufbereitet, gut lesen kann.

      meine überlegung war jetzt, da diese xml datei keine angabe zu irgendeiner xsl datei hat, und wenn sie eine hätte nicht auf meine hätte, dass ich durch eine lokale xml-datei ein xsl-script in gang bringe, dass die daten aus der internet-xml-datei sozusagen abholt und verarbeitet. die 2te xml datei ist so gesehn nur dafür da, das xsl-script zu starten

      1. Hallo,

        also es gibt eine xml datei, die auf einem server im internet liegt. ich hab keinen einfluss auf die xml datei. ich will diese datei mit hilfe von xsl in html umwandeln, sodass man diese datei, grafisch aufbereitet, gut lesen kann.

        meine überlegung war jetzt, da diese xml datei keine angabe zu irgendeiner xsl datei hat, und wenn sie eine hätte nicht auf meine hätte, dass ich durch eine lokale xml-datei ein xsl-script in gang bringe, dass die daten aus der internet-xml-datei sozusagen abholt und verarbeitet. die 2te xml datei ist so gesehn nur dafür da, das xsl-script zu starten

        Genau das hat dir "hh" vorgeschlagen:
        ------- dein.xml -------
        <?xml version="1.0" encoding="iso-8859-1"?>
        <data>
        </data>
        --------------------------

        ----- das XSL was du auch dein.xml anwendest ---
        <?xml version="1.0" encoding="iso-8859-1"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:variable name="myXML" select="document('http://.....  .xml')" />
         <xsl:template match="/data">
          <html>
           <head>
            <title></title>
           </head>
           <body>
            <xsl:apply-templates select="document('http://.....  .xml')/WurzelElementDesAnderenXMLs" />
           </body>
          </html>
         </xsl:template>

        <xsl:template match="ElementAusDemAnderenXML">
          ...
         </xsl:template>

        <xsl:template match="AnderesElementausDemAnderenXML">
          ...
         </xsl:template>
        </xsl:stylesheet>

        Es gäbe noch auch andere Möglichkeiten, z.B. über DTD, aber die vorgestellte Lösung ist die am wenigstens aufwändige und am einfachsten zu verwirklichende.

        Grüße
        Thomas

        1. mist ...

          <xsl:variable name="myXML" select="document('http://.....  .xml')" />

          die Variable brauchst du eigentlich nicht (habe vergessen zu löschen)

          Thomas

          1. ich habs jetzt auf folgende weise versucht. aber es klappt noch nicht.

            hier der code der xml datei:
            <?xml version="1.0" encoding="iso-8859-1"?>
            <?xml-stylesheet type="text/xsl" href="datenholen.xsl" ?>

            dann der code aus der datenholen.xsl datei:
            <?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>
            <style type="text/css">
            @import url(last.fm.css);
            </style>
            </head><body><table cellspacing="0" cellpadding="1" border="0" width="300">

            <xsl:apply-templates select="document('http://ws.audioscrobbler.com/1.0/user/Fre86/recenttracks.xml')/recenttracks/track" />

            </table></body></html>

            </xsl:template>

            <xsl:template match="track">
            <tr><td>

            <div style="position:relative;">
            <table cellspacing="0" cellpadding="0" border="0" width="100%">
            <tr>
            <td width="20" height="20">

            <div id="linkeSpalte">
             <div style="position:absolute; top:0px; z-index:2;"><img src="pics/note.gif" /></div>
             <div style="position:absolute; bottom:0px; z-index:1;"><img src="pics/links_unten.gif" /></div>
             <div style="position:absolute; top:10px; bottom:10px; width:100%; background-color:#dbe0cf; z-index:-1;"></div>
            </div>

            </td>
            <td id="titel" style="vertical-align:top;width:15px;"><xsl:number level="single" count="$liste/track" format="1. " /></td>
            <td id="titel"><xsl:value-of select="$liste/artist" /> - <xsl:value-of select="$liste/name" /></td>
            <td width="10">

            <div id="rechteSpalte">
             <div style="position:absolute; top:0px;"><img src="pics/ende_oben.gif" /></div>
             <div style="position:absolute; bottom:0px;"><img src="pics/ende_unten.gif" /></div>
             <div style="position:absolute; top:8px; bottom:8px; width:100%; background-color:#dbe0cf;"></div>
            </div>

            </td>
            </tr>
            </table>
            </div>

            </td></tr>
            </xsl:template>

            </xsl:stylesheet>

            ich weiß nicht, was daran falsch ist. vielleicht kannst du mir den weg mit den dtds auch mal genauer erklären. danke

            1. Hi, der weg ist richtig, nur verzeiht xsl bzw. xml Fehler nicht ;-) Also nimm einfach $liste weg, ich vermute mal die variable hattest du vorher mit document() belegt, also so funktioniert es:

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

              <xsl:template match="/">
                <html>
                 <head>
                  <style type="text/css">@import url(last.fm.css);</style>
                 </head>
                 <body>
                  <table cellspacing="0" cellpadding="1" border="0" width="300">

              <xsl:apply-templates select="document('http://ws.audioscrobbler.com/1.0/user/Fre86/recenttracks.xml')/recenttracks/track"/>
                  </table>
                 </body>
                </html>
               </xsl:template>

              <xsl:template match="track">
                <tr>
                 <td>

              <div style="position:relative;">
                   <table cellspacing="0" cellpadding="0" border="0" width="100%">
                    <tr>
                     <td width="20" height="20">

              <div id="linkeSpalte">
                       <div style="position:absolute; top:0px; z-index:2;">
                        <img src="pics/note.gif"/>
                       </div>
                       <div style="position:absolute; bottom:0px; z-index:1;">
                        <img src="pics/links_unten.gif"/>
                       </div>
                       <div style="position:absolute; top:10px; bottom:10px; width:100%; background-color:#dbe0cf; z-index:-1;"></div>
                      </div>
                     </td>
                     <td id="titel" style="vertical-align:top;width:15px;">
                      <xsl:number level="single" count="track" format="1. "/>
                     </td>
                     <td id="titel">
                      <xsl:value-of select="artist"/>- <xsl:value-of select="name"/></td>
                     <td width="10">

              <div id="rechteSpalte">
                       <div style="position:absolute; top:0px;">
                        <img src="pics/ende_oben.gif"/>
                       </div>
                       <div style="position:absolute; bottom:0px;">
                        <img src="pics/ende_unten.gif"/>
                       </div>
                       <div style="position:absolute; top:8px; bottom:8px; width:100%; background-color:#dbe0cf;"></div>
                      </div>
                     </td>
                    </tr>
                   </table>
                  </div>
                 </td>
                </tr>
               </xsl:template>
              </xsl:stylesheet>

              Gruss, Holger

              1. So könntest du es auch schrieben, vielleicht hilft das zum besseren Verständnis

                <?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"/>
                 <xsl:variable name="liste" select="document('http://ws.audioscrobbler.com/1.0/user/Fre86/recenttracks.xml')/recenttracks/*"/>
                 <xsl:template match="/">
                  <html>
                   <head>
                    <style type="text/css">@import url(last.fm.css);</style>
                   </head>
                   <body>
                    <table cellspacing="0" cellpadding="0" border="0" width="100%">
                      <xsl:for-each select="$liste">
                      <tr>
                      <td width="20" height="20">

                <div id="linkeSpalte">
                        <div style="position:absolute; top:0px; z-index:2;">
                         <img src="pics/note.gif"/>
                        </div>
                        <div style="position:absolute; bottom:0px; z-index:1;">
                         <img src="pics/links_unten.gif"/>
                        </div>
                        <div style="position:absolute; top:10px; bottom:10px; width:100%; background-color:#dbe0cf; z-index:-1;"></div>
                       </div>
                      </td>
                      <td id="titel" style="vertical-align:top;width:15px;">
                       <xsl:number level="single" count="track" format="1. "/>
                      </td>
                      <td id="titel">
                       <xsl:value-of select="artist"/>- <xsl:value-of select="name"/></td>
                      <td width="10">

                <div id="rechteSpalte">
                        <div style="position:absolute; top:0px;">
                         <img src="pics/ende_oben.gif"/>
                        </div>
                        <div style="position:absolute; bottom:0px;">
                         <img src="pics/ende_unten.gif"/>
                        </div>
                        <div style="position:absolute; top:8px; bottom:8px; width:100%; background-color:#dbe0cf;"></div>
                       </div>
                      </td>
                     </tr>
                     </xsl:for-each>
                    </table>
                   </body>
                  </html>
                 </xsl:template>
                </xsl:stylesheet>

              2. vielen dank. aber so hatte ich das auch schon. aber ich hab das problem gelöst bekommen. in der xml datei, die das xsl stylesheet aufruft muss einmal die gleichen objecte enthalten. dann klappts. frag mich nicht wieso aber so klappts.

                vielen dank für eure hilfe.

                1. Hallo,

                  vielen dank. aber so hatte ich das auch schon. aber ich hab das problem gelöst bekommen. in der xml datei, die das xsl stylesheet aufruft muss einmal die gleichen objecte enthalten. dann klappts. frag mich nicht wieso aber so klappts.

                  Weil das:
                  -------------
                  <?xml version="1.0" encoding="iso-8859-1"?>
                  <?xml-stylesheet type="text/xsl" href="datenholen.xsl" ?>
                  -------------

                  kein XML-Datei ist!
                  Ich habe dir doch geschreiben wie das geht. Zumindest das/ein Wurzelelement _muss_ in der XML-Datei vorhanden sein.

                  Mit:
                  ----------------
                  <?xml version="1.0" encoding="iso-8859-1"?>
                  <?xml-stylesheet type="text/xsl" href="datenholen.xsl" ?>
                  <data></data>

                  ---------------
                  <?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></head><body><table cellspacing="0" cellpadding="1" border="0" width="300">

                  <xsl:apply-templates select="document('http://ws.audioscrobbler.com/1.0/user/Fre86/recenttracks.xml')/recenttracks/track" />

                  </table></body></html>

                  </xsl:template>

                  <xsl:template match="track">
                  <tr><td>

                  <div style="position:relative;">
                  <table cellspacing="0" cellpadding="0" border="0" width="100%">
                  <tr>
                  <td width="20" height="20">

                  <div id="linkeSpalte">
                   <div style="position:absolute; top:0px; z-index:2;"><img src="pics/note.gif" /></div>
                   <div style="position:absolute; bottom:0px; z-index:1;"><img src="pics/links_unten.gif" /></div>
                   <div style="position:absolute; top:10px; bottom:10px; width:100%; background-color:#dbe0cf; z-index:-1;"></div>
                  </div>

                  </td>
                  <td id="titel" style="vertical-align:top;width:15px;"><xsl:number level="single" count="track" format="1. " /></td>
                  <td id="titel"><xsl:value-of select="artist" /> - <xsl:value-of select="name" /></td>
                  <td width="10">

                  <div id="rechteSpalte">
                   <div style="position:absolute; top:0px;"><img src="pics/ende_oben.gif" /></div>
                   <div style="position:absolute; bottom:0px;"><img src="pics/ende_unten.gif" /></div>
                   <div style="position:absolute; top:8px; bottom:8px; width:100%; background-color:#dbe0cf;"></div>
                  </div>

                  </td>
                  </tr>
                  </table>
                  </div>

                  </td></tr>
                  </xsl:template>

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

                  Funktioniert es einwandfrei.

                  Grüße
                  Thomas

      2. "die 2te xml datei ist so gesehn nur dafür da, das xsl-script zu starten"

        XML ist eine Markup Language und kann nichts starten. Was verwendest du fuer einen parser und welches OS?

        Ich habe mal mein Windows angekurbelt und selbst der MS XML Parser von Microsoft kann über Kommandozeile eine url quellen holen, also etwa so:

        msxsl.exe http://www.webseite.com/quelle.xml c:\lokalerort\stylesheet.xsl -o ausgabe.html

        (sofern du die msxsl nicht hast, dann musst du dir die von der MS homepage laden 50kbgross). Du muesstes also schon mal sagen, was du vorhast. Wenn du dass Ganze zB. fuer einen Internetauftritt brauchst, kann man auch serverseitig arbeiten, aber dafür muesste man wissen, was du hast.

        Gruß, Holger

        1. ich habe mac os x tiger sprich 10.4.5. davon darf das aber nicht abhängen. denn es muss auf jedem mac os x laufen ab der version 10.4. im mac os x gibt es die sogenannten widgets. mini programme, die im hintergrund laufen. die muss man nicht installieren und laufen auf client seitiger internet programmiersprachen technik. also es darf nicht bevor das ding funktioniert noch irgendwas installiert werden müssen. dann wäre das prinzip eines widgets verfehlt.