dex: Wie kann ich folgenden Link in der tabelle setzen?

Hi, kurz das Grundproblem: Habe eine Liste mit Publikationen als xml. Diese soll nun in einem ersten Schritt alle Publikationen in einer Tabelle veröffentlichen. Dabei werden jedoch nicht alle Elemente aufgeführt (zb die zusammenfassung hier abstract der publikation). In der Tabelle möchte ich nun realisieren, das bei einem mausklick auf den abstract dieser in einer neuen datei (am besten mit einem neuen xsl) angezeigt wird. Also ich klicke abstract bei der entsprechenden Publikation und es erscheint ein neues fentser, nur das hier nicht mehr alle publikationen angegeben sind, sonderen nur noch die ausgewählte und entsprechender elemente. Wie kann ich das realisieren?

als wp.xml habe ich:

<?xml version="1.0"?>
<!-- edited with XMLSpy v2005 sp1 U (http://www.xmlspy.com) by Dexter (Dexter Laboratories) -->
<?xml-stylesheet type="text/xsl" href="wp.xsl"?>
<list>
<workingpaper>
<title>Mustertitel</title>
<subtitle>Musteruntertitel</subtitle>
<abstract>Hier soll eine zusammenfassung stehen</abstract>
<wp_number>01</wp_number>
<date>
<month_long>XXXXXXX</month_long>
<month>XX</month>
<year>XXXX</year>
</date>
<autor>
<name>Mustermann</name>
<email>muster@email.com</email>
<phone>xxx</phone>
<fax>xxx</fax>
</autor>
<autor>
<name>Mustermann 2</name>
<email>xxx</email>
<phone>xxx</phone>
<fax>xxx</fax>
</autor>
</workingpaper>
<workingpaper>
<title>Mustertitel</title>
<subtitle>Musteruntertitel</subtitle>
<abstract>Hier soll eine zusammenfassung stehen für das zweite wp</abstract>
<wp_number>02</wp_number>
<date>
<month_long>XXXXXXX</month_long>
<month>XX</month>
<year>XXXX</year>
</date>
<autor>
<name>Mustermann</name>
<email>muster@email.com</email>
<phone>xxx</phone>
<fax>xxx</fax>
</autor>
<autor>
<name>Mustermann 2</name>
<email>xxx</email>
<phone>xxx</phone>
<fax>xxx</fax>
</autor>
</workingpaper>
</list>

Und als wp.xsl folgende, wobei die letzte spalte mit dem abstract nur provisorisch ist, da genau hier die verlinkung erfolgen soll.

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<HTML>
<BODY text="#000000" leftmargin="2" topmargin="2" marginwidth="2" marginheight="2">
<table cellpadding="4" cellspacing="4" width="97%" border="0" align="center">
<xsl:for-each select="list/workingpaper">
<tr align="center" valign="middle">
<td width="11%">
<xsl:value-of select="date/month"/>-<xsl:value-of select="date/year"/>
</td>
<td width="14%">
<xsl:value-of select="wp_number"/>
</td>
<td width="19%">
<xsl:for-each select="autor">
<xsl:value-of select="name"/>
<br/>
</xsl:for-each>
</td>
<td width="45%">
<xsl:value-of select="title"/> - <br/>
<xsl:value-of select="subtitle"/>
</td>
<td width="11%">
<div align="center">Abstract</div>
</td>
</tr>
</xsl:for-each>
</table>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>

  1. Hallo,

    Hi, kurz das Grundproblem: Habe eine Liste mit Publikationen als xml. Diese soll nun in einem ersten Schritt alle Publikationen in einer Tabelle veröffentlichen. Dabei werden jedoch nicht alle Elemente aufgeführt (zb die zusammenfassung hier abstract der publikation). In der Tabelle möchte ich nun realisieren, das bei einem mausklick auf den abstract dieser in einer neuen datei (am besten mit einem neuen xsl) angezeigt wird. Also ich klicke abstract bei der entsprechenden Publikation und es erscheint ein neues fentser, nur das hier nicht mehr alle publikationen angegeben sind, sonderen nur noch die ausgewählte und entsprechender elemente. Wie kann ich das realisieren?

    Du sagst leider nicht ob du die XML/XSL-Transformation am Server machst oder dem Bowser überlässt.
    Da könntest du deine Frage mit der Übergabe eines Paramters lösen, in etwa so wie unten, aber ohne, dass du eine neue XSL-Datei dafür brauchst.

    (code ist natürlich zu ergänzen)

    Grüße
    Thomas

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:param name="wpnumber" />
    ...
    <xsl:template match="/">
     <html>
      <head><title></title></head>
      <body>
       xsl:choose
        <xsl:when test="$wpnumber != ''">
         <xsl:apply-templates select="workingpaper[wp_number = $wpnumber]" />
        </xsl:when>
        xsl:otherwise
         <xsl:apply-templates select="list" />
        </xsl:otherwise>
       </xsl:choose>
      </body>
     </html>
    </xsl:template>

    <xsl:template match="list">
    <table cellpadding="4" cellspacing="4" width="97%" border="0" align="center">
     <xsl:for-each select="workingpaper">
     ...
     <div align="center"><a href="deinxml.xml?wpnumber={wp_number }">Abstract</a></div>
     ...
     </xsl:for-each>
    </table>
    </xsl:template>

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

    1. Hallo Thomas erst einmal danke für die Antwort, habe auch gleich meinen code eingearbeitet. Leider funktioniert aber der link nicht so richtig ;;-( Vielleicht könntest du ja noch einmal drüber schauen? Zu deiner ersten Frage ob Server oder Browser - so ist eine  xsl transformation per browser erwünscht. Ganz kurz noch einmal, ich habe nur eine XML Datei (wp.xml) in dieser alle Daten stehen, die liste gibt nur kurz Titel, Verfasser usw. wieder. Bei klick auf Abstract soll er dann nur die eine Publikation auflisten, wobei dort die ausführlchen Daten aufgelistet werden. (ich hoffe das klappt) Hier mein eingearbeite code für die xsl:

      <?xml version="1.0" encoding="UTF-8"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:param name="wpnumber" />
      <xsl:template match="/">
       <html>
        <head><title></title></head>
        <body>
         xsl:choose
          <xsl:when test="$wpnumber != ''">
           <xsl:apply-templates select="workingpaper[wp_number = $wpnumber]" />
          </xsl:when>
          xsl:otherwise
           <xsl:apply-templates select="list" />
          </xsl:otherwise>
         </xsl:choose>
        </body>
       </html>
      </xsl:template>
      <xsl:template match="list">
      <table cellpadding="4" cellspacing="4" width="97%" border="0" align="center">
      <xsl:for-each select="workingpaper">
      <tr align="center" valign="middle">
      <td width="11%">
      <xsl:value-of select="date/month"/>-xsl:value-of    select="date/year"/
      </td>
      <td width="14%">
      <xsl:value-of select="wp_number"/>
      </td>
      <td width="19%">
      <xsl:for-each select="autor">
      <xsl:value-of select="name"/>
      <br/>
      </xsl:for-each>
      </td>
      <td width="45%">
      <xsl:value-of select="title"/> - <br/>
      <xsl:value-of select="subtitle"/>
      </td>
      <td width="11%">
      <div align="center"><a href="wp.xml?wpnumber={wp_number }">Abstract</a></div>
      </td>
      </tr>
      </xsl:for-each>
      </table>
      </xsl:template>
      <xsl:template match="workingpaper">
      <!-- Hier sollten nun erst einmal provisorisch alle Daten des workinpaper stehen  -->
      <p align="center" style="font-family:Tahoma; font-size:48pt; color:red">
        <xsl:value-of select="." />
       </p>
      </xsl:template>
      </xsl:stylesheet>

      1. Hallo,

        Hallo Thomas erst einmal danke für die Antwort, habe auch gleich meinen code eingearbeitet. Leider funktioniert aber der link nicht so richtig ;;-( Vielleicht könntest du ja noch einmal drüber schauen? Zu deiner ersten Frage ob Server oder Browser - so ist eine  xsl transformation per browser erwünscht.

        Ich wollte dir nur beschid geben, dass ich noch keine Zeit hatte dir einen Code oder eine HowTo zu schreiben.
        Aber: im Archiv findest du von mir einen kompletten Code, der zeigt, wie eine Variable per Javascript für die XML/XSLT-Transformation gesetzt werden kann.
        Das ganze geht dort zwar von einer HTML-Seite als Basis aus, aber es dürfte sich auch für deine Zwecke adaptieren lassen. (suche mal nach meinem Namen und nach "a bad book", damit müsste der Beitrag zu finden sein)

        Sonst werde ich  mich am Abend dransetzen.

        Grüße
        Thomas

        1. Ware super nett, wenn du das hinbekommst. Habe mir auch dein bad book beispiel angeschuat. Dort stehen aber auch in der html im javascript jeder einzelne link, das waere zu aufwending, wenn die xml ueber 100 publikationen enthalten soll. Bis jetzt habe ich auch noch kein Beispiel gefunden, in dem die parameter über die url an die xsl gegebeb werden, aber ich baue ganz auf dich ;-)

          1. Ware super nett, wenn du das hinbekommst. Habe mir auch dein bad book beispiel angeschuat. Dort stehen aber auch in der html im javascript jeder einzelne link, das waere zu aufwending, wenn die xml ueber 100 publikationen enthalten soll.

            Deshalb sagte du muss den Script adaptieren! ;-)

            »»Bis jetzt habe ich auch noch kein Beispiel gefunden, in dem die parameter über die url an die xsl gegebeb werden, aber ich baue ganz auf dich ;-)

            Hier der Code IE + Mozilla/Netscape

            Hoffe es hilft,
            Grüße
            Thomas
            -------------------------------------------------------
            <?xml version="1.0" encoding="iso-8859-1"?>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
             <xsl:param name="wpnumber" />

            <xsl:template match="/">
              <html>
               <head>
                <script language="JavaScript" type="text/javascript">
                 /* FÜR DEN IE  */
                 var objSrcTree, ObjXSLT, objCache;

            /* FÜR MOZILLA */
                 var xslStylesheet;
                 var xsltProcessor = (window.ChromeWindow) ? new XSLTProcessor() : "";
                 var myDOM;
                 var xmlDoc;

            function init()
                  {
                  if (window.ActiveXObject)
                   {
                    objSrcTree = new ActiveXObject('MSXML2.DOMDocument.4.0');
                    objSrcTree.async = false;
                    objSrcTree.load('wp.xml');

            objXSLT=new ActiveXObject('MSXML2.FreeThreadedDOMDocument.4.0');
                    objXSLT.async = false;
                    objXSLT.load('wp.xsl');

            objCache   = new ActiveXObject("Msxml2.XSLTemplate.4.0");
                    objCache.stylesheet = objXSLT;

            //output.innerHTML = "";
                  }
                  else if (window.ChromeWindow)
                   {
                    // load the xslt file
                    var myXMLHTTPRequest = new XMLHttpRequest();
                    myXMLHTTPRequest.open("GET", "wp.xsl", false);
                    myXMLHTTPRequest.send(null);

            xslStylesheet = myXMLHTTPRequest.responseXML;
                    xsltProcessor.importStylesheet(xslStylesheet);

            // load the xml file
                    myXMLHTTPRequest = new XMLHttpRequest();
                    myXMLHTTPRequest.open("GET", "wp.xml", false);
                    myXMLHTTPRequest.send(null);

            xmlDoc = myXMLHTTPRequest.responseXML;

            //document.getElementById("output").innerHTML = "";
                   }
                  else
                   alert("Ihr Browser unterstützt keine XML-XSL-Transformation");
                  }

            function show(nAbstrakt)
                  {
                  if (window.ActiveXObject)
                   {
                    var objXSLTProc = objCache.createProcessor();
                    objXSLTProc.input = objSrcTree;
                    objXSLTProc.addParameter("wpnumber", nAbstrakt, "");
                    objXSLTProc.transform();
                    output.innerHTML = objXSLTProc.output;
                   }
                  else if (window.ChromeWindow)
                   {
                    var myParam = xsltProcessor.getParameter(null, "wpnumber");
                    xsltProcessor.setParameter(null, "wpnumber", nAbstrakt);

            var fragment = xsltProcessor.transformToFragment(xmlDoc, document);
                    myDOM = fragment;
                    document.getElementById("output").innerHTML = "";
                    document.getElementById("output").appendChild(fragment);
                   }
                  }
                </script>
                <title>Test</title>
               </head>
               <body onload="init();">
                xsl:choose
                 <xsl:when test="$wpnumber != ''">
                  <xsl:apply-templates select="list/workingpaper[wp_number = $wpnumber]" />
                 </xsl:when>
                 xsl:otherwise
                  <xsl:apply-templates select="list" />
                 </xsl:otherwise>
                </xsl:choose>
               </body>
              </html>
             </xsl:template>

            <xsl:template match="list">
              <div id="output">
               <table cellpadding="4" cellspacing="4" width="97%" border="1" align="center">
                <xsl:for-each select="workingpaper">
                 <tr align="center" valign="middle">
                  <td width="11%">
                   <xsl:value-of select="date/month"/>-xsl:value-of    select="date/year"/
                  </td>
                  <td width="14%">
                   <xsl:value-of select="wp_number"/>
                  </td>
                  <td width="19%">
                   <xsl:for-each select="autor">
                    <xsl:value-of select="name"/>
                    <br/>
                   </xsl:for-each>
                  </td>
                  <td width="45%">
                   <xsl:value-of select="title"/> - <br/>
                   <xsl:value-of select="subtitle"/>
                  </td>
                  <td width="11%">
                   <div align="center">
                    <a href="javascript:show('{wp_number}')">Abstract</a>
                   </div>
                  </td>
                 </tr>
                </xsl:for-each>
               </table>
              </div>
             </xsl:template>

            <xsl:template match="workingpaper">
              <!-- Hier sollten nun erst einmal provisorisch alle Daten des workinpaper stehen  -->
              <div>
               <a href="javascript:location.reload()">ZURÜCK</a>
              </div>
              <div id="output" align="center" style="font-family:Tahoma; font-size:48pt; color:red">
               <xsl:value-of select="." />
              </div>
             </xsl:template>
            </xsl:stylesheet>

            1. Very nice and thx a lot. An wen darf ich das Entgelt überweisen?-)
              Nun habe ich aber trotzdem noch ein zwei Fragen, die ich gerne los werden will an eine kompetente Stelle. Geht es wirklich nicht ohne Javascript (da ich nicht gerade ein Pro darin bin wie auch in xml;-)

              Wenn jetzt meine xml datei auf mehrere MB anwächst, heisst dass dann, dass derjenige, der die Seite liest auch erst die komplette xml Datei "herunterladen" muss (eigentlich logisch aber trotzdem zur Sicherheit die Frage (Unser Server unterstützt nur asp - deshalb auch kein php möglich, um dass problem zu lösen)- und wie könnte man es serverseitig lösen. Ich weiss, vielleicht schon zu viele Fragen aber da du mir der Experte erscheinst, bei dem ganz klar die komperativen Vorteile liegen ...

              Gruss, Dex

              PS: Thx agian nice work

              1. Hi,

                Very nice and thx a lot. An wen darf ich das Entgelt überweisen?-)

                Wohltätige Organisationen gibt es genug. Da wirst Du schon eine finden.

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
              2. Hallo,

                Very nice and thx a lot. An wen darf ich das Entgelt überweisen?-)

                Wenn du darauf bestehst ;-)
                http://verein.de.selfhtml.org/dokumente/faq.htm#unterstuetzen
                oder https://www.drk.de/spenden/

                Nein, natürlich brauchst du nichts zu Zahlen. Freut mich, dass der Code dir weitergeholfen hat.

                Nun habe ich aber trotzdem noch ein zwei Fragen, die ich gerne los werden will an eine kompetente Stelle. Geht es wirklich nicht ohne Javascript (da ich nicht gerade ein Pro darin bin wie auch in xml;-)

                Nicht wenn du die XML/XSL-Transformation dem Browser überlässt.

                Wenn jetzt meine xml datei auf mehrere MB anwächst, heisst dass dann, dass derjenige, der die Seite liest auch erst die komplette xml Datei "herunterladen" muss (eigentlich logisch aber trotzdem zur Sicherheit die Frage

                Ja.
                Alternative wäre, mehrere XML-Dateien zu erstellen und den Namen der XML-Datei an die Funktion übergeben.
                Den Code muss man aber ein wenig abändern, nur als Bsp.:
                im XML:
                <list filename="wp.xml">

                im XSL:
                die zwei Zeilen so abändern:
                objSrcTree.load('<xsl:value-of select="list/@filename" />');
                myXMLHTTPRequest.open("GET", "<xsl:value-of select="list/@filename" />", false);

                (Unser Server unterstützt nur asp - deshalb auch kein php möglich, um dass problem zu lösen)- und wie könnte man es serverseitig lösen.

                Du kannst selbstverständlich auch mit APS XML/XSL-Transformation machen.

                http://www.siteexperts.com/tips/xml/ts02/page1.asp
                oder
                http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/

                da kannst du auch auf das JavaScript verzichten und den Parameter als URL-Parameter übergeben.
                Aber frage mich nicht zu ASP, den wo das A beginnt hören die "komperativen Vorteile" auch schon auf ;-)

                Grüße
                Thomas