Announcement

Collapse
No announcement yet.

XML/XSL - for-each filtern mit Paramter

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

  • XML/XSL - for-each filtern mit Paramter

    HallO!

    Ich habe eine Frage bzgl. der XSL Transformation einer XML Datei. Und zwar möchte ich die Ausgabe in Abhängigkeit eines Parameters filtern. Zum besseren Verständnis, hier kurz der Quelltext.

    XML...
    HTML Code:
    <root>
      <entry id="10">
        <author>hsajkdh</author>
        <title>asdas</title>
        <content>asdasd</content>
      </entry>
      <entry id="12">
        <author>asdasdasd</author>
        <title>sadasdasd</title>
        <content>asdasd</content>
      </entry>
    </root>
    XSL Ausschnitt...
    HTML Code:
    <xsl:param name="filter" />
    ...
    <xsl:for-each select="root/entry[@id = *[name()=$filter]]"">
      ...
    </xsl:for-each>
    Mit einem festen Wert funktioniert das ganze sehr gut. Das Problem liegt also an dem Paramter. Leider weiß ich gerade nicht mehr weiter und hoffe darum auf eure Hilfe!

    gruß

  • #2
    Hat niemand eine Idee?

    Comment


    • #3
      Es ist Wochenende....und kaum 4 Std vergangen. Bitte gedulde dich
      Christian

      Comment


      • #4
        Was genau willst du denn erreichen? Mit dem Schnipsel wissen wir nicht wirklich, welchen Wert du dem Parameter gibst und welches Resultat du haben willst und welches du im Moment bekommst.

        Und das Prädikat in root/entry[@id = *[name()=$filter]] macht ja mit deinem XML nur wirklich Sinn, wenn $filter z.B. den Wert "title" hat und dann ein Element wie
        Code:
          <entry id="10">
            <author>hsajkdh</author>
            <title>10</title>
            <content>asdasd</content>
          </entry>
        existiert, bei dem der Wert des "id"-Attributes gleich dem Wert des Elementes ist, das durch den Ausdruck *[name()=$filter] selektiert wird, in dem Fall also des "title"-Elementes.

        Comment


        • #5
          Hallo!

          stimmt, das ist natürlich quatsch... entstand durch unüberlegtes Copy&paste, tschuldigung
          ..so steht das nicht bei mir im quellcode.

          ich möchte, wie du schon geahnt hast, nach author, title oder content filter, habe dafür aber bisher noch keine lösung gefunden.

          in dem Paramter filter übergebe ich eines der worte "title", "author" oder "content".

          Comment


          • #6
            Wenn du als Wert des Parameters "filter" einen Elementnamen wie "title", "author" oder "content" übergibst, frage ich mich immer noch, was du dann filtern willst, denn damit haben wir ein Element, nach dem man filtern kann, aber keinen Wert.
            Eventuell willst du ja zwei Parameter benutzen:
            Code:
            <xsl:param name="element-name" select="'title'"/>
            <xsl:param name="element-value" select="'asdas'"/>
            dann halt
            Code:
            ...
            <xsl:for-each select="/root/entry[*[local-name() = $element-name] = $element-value]">...</xsl:for-each>
            ...
            das selektiert dann die "entry"-Elemente, bei denen ein Kindelement mit dem Namen $element-name existiert, das den Wert $element-value hat.

            So du einfach die Elemente mit dem Namen $filter finden willst, dann per
            Code:
            <xsl:for-each select="/root/entry/*[local-name() = $filter]">...</xsl:for-each>

            Comment


            • #7
              Hallo!
              ich möchte nach einer id filter.
              Tut mir leid das ich hier soviel verwirrung stifte, aber bin grad unterwegs und habe den code nicht vor mir. ...das was ich erklärt habe war ein anders problem.
              In filter ist eine id enthalten. mein letzter post war also nicht korrekt (habe hier grad mehrer sachen in diesem zusammenhang zu lösen).

              Ich übergebe in Filter also eine ID. Es soll nur der Eintrag mit dieser ID angezeigt werden.

              Comment


              • #8
                Code:
                <xsl:param name="id" select="10"/>
                ...
                
                <xsl:for-each select="/root/entry[@id = $id]">...</xsl:for-each>
                filtern dann die "entry"-Elemente anhand des "id"-Attributwertes.

                Comment


                • #9
                  Das funktioniert aber nur wenn ich den Wert, so wie in deinem Beispiel, fest auf 10 (bzw. die jeweilige ID) setze. Wird der Wert allerdings dynamisch an den XSLT Prozessor übergeben, funktioniert es nicht mehr.

                  Comment


                  • #10
                    Poste mal die exakten Details, die es uns erlauben, das Problem zu reproduzieren, wie Name und Version des XSLT-Prozessors, Art und Weise, in der der Parameter gesetzt wird (API, Kommandozeile, XML-Editor?) und minimale aber komplette Beispiele von XML-Eingabedokument, XSLT, gewünschtem Resultat und dem aktuellem Resultat.

                    Ich sehe keinen Grund, warum der Parameter nicht berücksichtigt werden sollte. So der Code mit dem fest vorgegebenen Parameter funktioniert, aber mit einem von extern übergebenen nicht, geht eher bei der Übergabe etwas schief.

                    Comment


                    • #11
                      Also, die XML wie im ersten post.

                      PHP Aufruf...
                      PHP Code:
                      ...
                      $xslDoc = new DOMDocument();
                      $xslDoc->load($xslfile);

                      $xmlDoc = new DOMDocument();
                      $xmlDoc->load($xmlfile);

                      $proc = new XSLTProcessor();

                      $proc->setParameter('''filter'$id);
                      $proc->importStylesheet($xslDoc);
                      $proc->transformToXML($xmlDoc);
                      ... 
                      die xsl...
                      HTML Code:
                      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
                      <xsl:output method="html"/>
                      <xsl:param name="filter"/>
                      ...
                      <xsl:template match="/">
                      ...
                      <xsl:for-each select="blox/entry[@id = $filter]">
                      ...
                      </xsl:for-each>
                      ...
                      nun sollen in der foreach alle Datensätze ausgegeben werden die die übergebene ID als id Attribut haben (foreach daher, falls es durch mögliche fehler mehrere geben sollte.)

                      Comment


                      • #12
                        Und welchen Wert und Datentyp hat $id im PHP-Code? Wenn du in PHP
                        [highlight=php]
                        $id = '10';
                        $proc->setParameter('', 'filter', $id);
                        [/highlight]
                        setzt, funktioniert das dann wirklich nicht? Dann muss mal jemand anderes helfen, der sich mit PHP-APIs auskennt. Im XSLT ist alles in Ordnung.

                        Comment


                        • #13
                          Ähhh, ist es sicher, dass


                          <xsl:for-each select="blox/entry[@id = $filter]">

                          wirklich $filter sein muss? Das PHP sieht ok aus, wenn kein namespace benutzt wird.
                          Christian

                          Comment


                          • #14
                            Ja, um Parameter oder Variablen zu referenzieren, benutzt man in XPath bzw. XSLT $var. Denn "var" alleine selektiert XML-Elemente mit Namen "var". Und der XSLT-Code funktioniert ja auch mit $filter, wenn der Parameterwert im Stylesheet gesetzt wird, nur beim Setzen mit PHP funktioniert es bei SteVO nicht.

                            Comment


                            • #15
                              Hallo!
                              so, bin nun wieder zu hause und konnte jetzt nochmal über den code schauen... nachdem ich alles nochmal durchgegangen bin, funktioniert es nun doch so wie hier gesagt.
                              VIELEN DANK!

                              Comment

                              Working...
                              X