Tobias : XPATH mit Javascript Funktionen erweitern

Hallo
Nach vergeblicher Internetrecherche versuche ich das mal hier.

Ich möchte eine über XSL transformierte XML Datei aufrufen.
Abhängig von in der URL übergebenen Vaiablen soll nur ein Teil Datensätze angezeigt werden.

Meine Idee
Auslesen der URL mit Javascript
Über XPATH ein vergleich der aktuellen Zeile mit dem Rückgabewert einer Javascriptfunktion.

<xsl:if test="position()=get_value( )">
schreib Datensatz hin
</xsl:if>

Fehlermeldung
'get_value' ist keine gültige XSLT- oder XPath-Funktion. position()=-->get_value()<--

So ein Mist hat jemand eine Idee wie man soetwas realisieren könnte?

Danke schon mal.

  1. Hallo,

    Ich möchte eine über XSL transformierte XML Datei aufrufen.
    Abhängig von in der URL übergebenen Vaiablen soll nur ein Teil Datensätze angezeigt werden.

    Meine Idee
    Auslesen der URL mit Javascript
    Über XPATH ein vergleich der aktuellen Zeile mit dem Rückgabewert einer Javascriptfunktion.

    *säuftz*  ist heute irgendwas los, dass alle Apfel mit Birnen verwechseln?
    Erstmal lese bitte: [pref:t=77956&m=450669] dazu gehört auch dass in XML/XSLT kein JavaScript ("nur mal so" wie in HTML) funktioniert.

    <xsl:if test="position()=get_value( )">
    schreib Datensatz hin
    </xsl:if>

    Fehlermeldung
    'get_value' ist keine gültige XSLT- oder XPath-Funktion. position()=-->get_value()<--

    Das ist ja auch logisch. Du arbeitest im XSLT dort werden eben XPath- oder XSLT-Funktionen erwartet. get_value() ist nunmal keine von beiden.

    Jetzt muss du dich entscheiden:
    entweder machst du deine Anzeige/Nichtanzeige in HTML, oder willst du wirklich versuchen über JavaScript Einfluß auf die Transformation zu nehmen.

    Beim letzeren: im Archiv findest du von Thomas Meinike und auch von mir koplette Beispile dafür, wie du mit Hilfe von JavaScrip sowas machen kannst.

    Grüße
    Thomas

    1. Ich weiss durchaus was Äpfel und Birnen sind

      und auch das Javascript erst prozessiert wird wenn die Transformation gelaufen ist.

      Es hat mich auch nicht gewundert dass das nicht funktioniert, man greift aber zu jedem Strohalm.

      Natürlich könnte ich die Datensätze in Javascript filtern nachdem si komplett transformiert wurden.

      eleganter fände ich das aber, wenn man eine Möglichkeit hätte Xpath Funktionen zu schreiben.

      Oder eine andere Möglichkeit auf die Transformation Enfluss zu nehmen von ausserhalb des aufzurufenden XML Dokumentes.

      Eine XPath Funktion zum auslesen der URL wäre auch was feines.

      na, ich suche mal nach Thomas Meinike im Archiv.

    2. Aha ich komme der Sache schon näher
      in http://www.datenverdrahten.de/iproxslt/
      ist im letzten Beispiel das aktuelle Datum übertragen worden

      nur wo wird das gefüllt?

      Die Zip Datei mit dem gesamten Beispiel ist leider nicht mehr zu erreichen.

      Schade

    3. <xsl:param name="paramter" />

      Das ist eigentlich genau das was ich brauche
      schade nur das Browser das nicht über die URL beschicken können.

      Bleibt wohl nur der Aufbau über den DOM-tree aus den Beispielen.

      Gibt es das:
      http://www.datenverdrahten.de/iproxslt/tourdaten/iejs/index.htm
      auch mit einem Browser unabhängigen Ansatz?

      1. Hallo,

        <xsl:param name="paramter" />

        Das ist eigentlich genau das was ich brauche
        schade nur das Browser das nicht über die URL beschicken können.
        Bleibt wohl nur der Aufbau über den DOM-tree aus den Beispielen.
        Gibt es das:
        http://www.datenverdrahten.de/iproxslt/tourdaten/iejs/index.htm
        auch mit einem Browser unabhängigen Ansatz?

        Nein. Weil der IE und Mozilla hier doch wieder verschiedene Wege gehen.
        Hier ein Beispiel für beide Browser (ich habe aber keine Lust gehabt jetzt eine Browserabfrage einzubauen, die Namen der xml & xsl Datei muss du dann für dich anpassen):

        Hoffe es hilft dir
        Grüße
        Thomas

        ----------------- xml (book-review.xml) --------------------
        <?xml version='1.0'?>
        <book-review>
           <book>
              <title>A Good Book</title>
              <author>The Good Writer</author>
              <publisher>The Publisher</publisher>
              <date>A Good Day</date>
              <review>
                  <title>A Good Book</title> by <author>The Good Writer</author>,
                  published by <publisher>The Publisher</publisher> on <date>A
                  Good Day</date>, is indeed a good book.
              </review>
           </book>
           <book>
              <title>A Bad Book</title>
              <author>The Bad Writer</author>
              <publisher>The Publisher</publisher>
              <date>A Bad Day</date>
              <review>
                 <title>A Bad Book</title> by <author>The Bad Writer</author>,
                 published by <publisher>The Publisher</publisher> on <date>A Bad
                 Day</date>, is indeed a bad book.
              </review>
           </book>
           <book>
              <title>A So-so Book</title>
              <author>The So-so Writer</author>
              <publisher>The Publisher</publisher>
              <date>A So-so Day</date>
              <review>
                 <title>A So-so Book</title> by <author>The So-so Writer</author>,
                 published by <publisher>The Publisher</publisher> on
                 <date>A So-so Day</date>, is indeed a so-so book.
              </review>
           </book>
        </book-review>

        ---------------------  xsl (book-review.xsl) -----------------------

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

        <xsl:param name="title" />

        <xsl:template match="/">
            <html>
              <head>
              </head>
              <body>
                 <xsl:apply-templates select="//book[title=$title]" />
              </body>
            </html>
          </xsl:template>

        <xsl:template match="book">
             <table>
                <tr>
                  <td style="font-weight:bold">Titel:</td>
                  <td><xsl:apply-templates select="title"/></td>
                </tr>
                <tr>
                  <td style="font-weight:bold">Autor:</td>
                  <td><xsl:apply-templates select="author"/></td>
                </tr>
                <tr>
                  <td style="font-weight:bold">Datum:</td>
                  <td><xsl:apply-templates select="date"/></td>
                </tr>
                <tr>
                  <td style="font-weight:bold">Verlag:</td>
                  <td><xsl:apply-templates select="publisher"/></td>
                </tr>
                <tr>
                  <td style="font-weight:bold">Rezension:</td>
                  <td><xsl:apply-templates select="review"/></td>
                </tr>
             </table>
          </xsl:template>

        <xsl:template match="title">
              <span><xsl:value-of select="."/></span>
          </xsl:template>

        <xsl:template match="author">
              <span><xsl:value-of select="."/></span>
          </xsl:template>
          <xsl:template match="publisher">
              <span><xsl:value-of select="."/></span>
          </xsl:template>
          <xsl:template match="date">
              <span><xsl:value-of select="."/></span>
          </xsl:template>

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

        </xsl:stylesheet>

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

        function init()
              {
                 objSrcTree = new ActiveXObject('MSXML2.DOMDocument.4.0');
                 objSrcTree.async = false;
                 objSrcTree.load('book-review.xml');

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

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

        output.innerHTML = "Select a book above to read the review!";
              }

        function show(title)
              {
                 var objXSLTProc = objCache.createProcessor();
                 objXSLTProc.input = objSrcTree;
                 objXSLTProc.addParameter("title", title, "");
                 objXSLTProc.transform();
                 output.innerHTML = objXSLTProc.output;
              }

        */

        /* FÜR MOZILLA */
          var xslStylesheet;
          var xsltProcessor = new XSLTProcessor();
          var myDOM;
          var xmlDoc;

        function init()
           {
            // load the xslt file
            var myXMLHTTPRequest = new XMLHttpRequest();
            myXMLHTTPRequest.open("GET", "book-review.xsl", false);
            myXMLHTTPRequest.send(null);

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

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

        xmlDoc = myXMLHTTPRequest.responseXML;

        document.getElementById("output").innerHTML = "Select a book above to read the review!";
           }

        function show(title)
           {
            var myParam = xsltProcessor.getParameter(null, "title");
            xsltProcessor.setParameter(null, "title", title);

        var fragment = xsltProcessor.transformToFragment(xmlDoc, document);
            myDOM = fragment;
            document.getElementById("output").innerHTML = "";
            document.getElementById("output").appendChild(fragment);
           }
           </script>
           <title>XML / XSLT  mit JavaScript bearbeiten:IE + Mozilla</title>
        </head>

        <body onload="init();">
           <div>Books reviewed:
                <a href="javascript:show('A Good Book')">A Good Book</a>
                <a href="javascript:show('A Bad Book')">A Bad Book</a>
                <a href="javascript:show('A So-so Book')">A So-so Book</a>
           </div>
           <div id="output" style="margin:1em"></div>
        </body>
        </html>

  2. Hi,

    Ich möchte eine über XSL transformierte XML Datei aufrufen.
    Abhängig von in der URL übergebenen Vaiablen soll nur ein Teil Datensätze angezeigt werden.

    Wie wird die Transformation durchgeführt?

    U.U. gibt es die Möglichkeit, mit xsl:param zu arbeiten.

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.Mud-Guard.de/
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.