Announcement

Collapse
No announcement yet.

XML Dokument per URL steuern (PHP)

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

  • XML Dokument per URL steuern (PHP)

    Hallo

    Vielleich hat jemand von euch eine Idee oder Hinweis.
    Baue aus den bisherigen Fragen jetzt komplette Lösung zusammen

    Ziel der Lösung:
    Ich habe ein XML Dokument bei der jedes Element mit einer ID ausgestattet ist.
    Zwei Strings werden per PHP an XSLT übergeben.

    p_contextnodeID ist die ID des contextknoten
    p_step wird der Schritt übergeben

    Zu Testzwecken habe ich diese parameter im Stylesheet, ID bzw Schritt zugewiesen.

    Ergebnis sollte ein über die URL gesteuerte/gefilterte Ausgabe des XML Dokumentes sein, welche als Basis den Contextknoten+Schritt verwendet.

    Code:
    <!-- **
    * @NAME: SHOWSTEP
    * @DESC: Zeigt auf Basis eines Contextnode+Step welche aus der URL stammt- den Ergebnisbaum 
    *
    * @V0.1: 2011.05.28
    *-->
    <xsl:stylesheet 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
      xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:exsl="http://exslt.org/common"
      xmlns:dyn="http://exslt.org/dynamic" 
      extension-element-prefixes="dyn exsl">
    
    <!-- contextnodeID aus URL als String uebergeben -->
    <xsl:param name="p_contextnodeID" select="'h-e59cc1ac-6855-11e0-b226-3e83d7addb43'"/>
    <!-- contextnode daraus bauen -->
    <xsl:param name="p_contextnode" select="//*[@id='$p_contextnodeID']"/>
    
    <!-- p_step aus URL als String uebergeben-->
    <xsl:param name="p_step" select="'*[2]'"/>
    <!-- aus String p_step wird eine dynamische String gebaut welche als "Schritt" verarbeited wird -->
    <xsl:param name="p_nodeset" select="dyn:evaluate($p_step)"/>
    
    <!-- Schritt wird verarbeitet und als nodeset in p_nodesetB gespeichert -->
    <xsl:param name="p_nodesetB" select="exsl:node-set($p_contextnode//$p_nodeset)"/>
    
    
    <xsl:template match="/">
    
    
    <xsl:value-of select="count($p_nodesetB)"/>-
    <br/>
    <xsl:for-each select="$p_nodesetB">z
      <xsl:value-of select="node()"/><br/>
    </xsl:for-each>
    <br/>
    </xsl:template>
    
    
    
    </xsl:stylesheet>

    vielen Dank

  • #2
    Das Problem: Leider gibt mir exsl:node-set einen leeren nodeset zurück.

    Comment


    • #3
      Code:
      <xsl:param name="p_contextnode" select="//*[@id='$p_contextnodeID']"/>
      sollte
      Code:
      <xsl:param name="p_contextnode" select="//*[@id=$p_contextnodeID]"/>
      sein.
      Und statt
      Code:
      <xsl:param name="p_nodeset" select="dyn:evaluate($p_step)"/>
      willst du eher
      Code:
      <xsl:param name="p_nodeset" select="dyn:evaluate(concat('$p_contextnode/', $p_step))"/>
      exsl: node-set brauchst du gar nicht.

      Comment


      • #4
        Kommt leider noch immer die leere Menge im p_nodeset - am weggelassen exsl: node-set kann es nicht liegen da hätte ich zumindest einen Knoten. Eine Idee?

        Code:
        <!-- **
        * @NAME: SHOWSTEP
        * @DESC: Zeigt auf Basis eines Step - gesammten Nodeset+ContextKnoten+Nodesetfragment aus STEP
        *
        * @V0.1: 2011.05.30 Entfernung exsl: node-set
        * @V0.2: 2011.05.XX
        *-->
        <xsl:stylesheet 
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
          xmlns:xlink="http://www.w3.org/1999/xlink"
          xmlns:exsl="http://exslt.org/common"
          xmlns:dyn="http://exslt.org/dynamic" 
          extension-element-prefixes="dyn exsl">
        
        <!-- p_contextnodeID aus URL -->
        <xsl:param name="p_contextnodeID" select="'h-e59cc1ac-6855-11e0-b226-3e83d7addb43'"/>
        <!-- contextnode daraus bauen -->
        <xsl:param name="p_contextnode" select="//*[@id=$p_contextnodeID]"/>
        
        <!-- p_step aus URL -->
        <xsl:param name="p_step" select="'//*'"/>
        <!-- aus String p_step wird eine dynamische String gebaut welche als "Schritt" verarbeited wird -->
        <xsl:param name="p_nodeset" select="dyn:evaluate(concat('$p_contextnode', $p_step))"/>
        
        
        <xsl:template match="/">
        
        <xsl:value-of select="count($p_nodeset)"/>-
        <br/>
        <xsl:for-each select="$p_nodeset">
          <xsl:value-of select="node()"/><br/>
        </xsl:for-each>
        <br/>
        </xsl:template>
        
        
        </xsl:stylesheet>

        Comment


        • #5
          Ohne das XML-Dokument zu sehen, kann niemand sagen, warum das Stylesheet keinen Knoten findet.
          Wenn ich mit Xalan Java das Stylesheet
          Code:
          <xsl:stylesheet
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:dyn="http://exslt.org/dynamic"
            exclude-result-prefixes="dyn"
            version="1.0">
            
            <xsl:output method="text"/>
            
            <xsl:param name="id">e3</xsl:param>
            <xsl:param name="step">*[2]</xsl:param>
            
            <xsl:variable name="n1" select="//*[@id = $id]"/>
            <xsl:variable name="ns" select="dyn:evaluate(concat('$n1/', $step))"/>
            
            <xsl:template match="/">
              <xsl:value-of select="$ns"/>
            </xsl:template>
            
          </xsl:stylesheet>
          auf das Dokument
          Code:
          <root id="e1">
            <foo id="e2">
              <bar id="e3">
                <baz id="e4">Kibology</baz>
                <foobar id="e5">Xibology</foobar>
              </bar>
            </foo>
          </root>
          anwende, dann wird "Xibology", also ist der von mir vorgeschlagene Code meines Erachtens schon der richtige Ansatz.

          Wenn du immer noch Probleme hast, dann poste genug Detailinformationen, dass wir das Problem reproduzieren können.

          Comment


          • #6
            Du hast natürlich recht, ohne XML läuft nix. Dein Beispiel hat mir geholfen.

            Kann jetzt per SVG den kompletten Baum ausgeben. Der Kontextknoten ist eingefärbt. Habe jetzt fast alles gelöst, bis auf ein Problem.


            Problem:
            Bei "Blaues Rechteck - Aktueller Knoten ist in nodeset Menge" sollte eine Abfrage sein ob der current() sich in der der Menge $nodeset befindet.


            Das Ziel ist eine grafische Darstellung wie: http://pimpmyxslt.com/axesviz.aspx
            Anmerkung SVG benötigt eine FF4.0


            Code:
            <!-- **
            * @NAME: SHOWSTEP
            * @DESC: Visialisierung eines Nodesets
            *        Zeigt den gesammten Nodeset in Form eines SVG Baumes 
            *        Kontextknoten+Schritt werden eingefaerbt angezeigt
            *
            * @V0.1: 2011.05.30
            *-->
            <xsl:stylesheet 
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
              xmlns:xlink="http://www.w3.org/1999/xlink"
              xmlns:dyn="http://exslt.org/dynamic" 
              extension-element-prefixes="dyn">
              
            
              <!-- contextnodeID aus URL holen -->
              <xsl:param name="p_contextnodeID">h-b6cf44e8-88f9-11e0-ba37-5c8176c98c64</xsl:param>
              <!-- p_step aus URL -->
              <xsl:param name="p_step">//*</xsl:param>
            
            
              <!-- contextnode erzeugen -->
              <xsl:variable name="contextnode" select="//*[@id = $p_contextnodeID]"/>
              <!-- p_step wird eine dynamische String gebaut welche als "Schritt" verarbeited wird -->
              <xsl:variable name="nodeset" select="dyn:evaluate(concat('$contextnode',$p_step))"/>
              
              <!-- Hoehe svg -->
              <xsl:variable name="svgheight" select="count(//*)*15"/>
            
            
            
            
              <!-- SVG Frame -->
              <xsl:template match="/">
            
                <svg xmlns="http://www.w3.org/2000/svg" width="300" height="{$svgheight}"> 
                  <xsl:apply-templates/>
                </svg>
            
                <xsl:value-of select="$nodeset"/>
              </xsl:template>
            
            
            
            
              <!-- Ausgabe des Ergebnisbaumes -->
              <xsl:template match="node()">
            
                <xsl:variable name="pos"><xsl:number level="any" count="*"/></xsl:variable>
                <xsl:variable name="posY" select="$pos*15"/>
                <xsl:variable name="posX" select="count(ancestor-or-self::*[position()])*20"/>
            
            
                <!-- Link mit parameter -->
                <xsl:element name="a">
                  <xsl:attribute name="xlink:href" select="index.php"/>
            
                  <!-- Rotes Rechteck - Aktueller Knoten ist Kontextknoten -->
                  <xsl:if test="current()=$contextnode">
                    <rect x="{$posX}" y="{$posY}" width="8" height="8"  style="fill:red;"/>
                  </xsl:if>
            
                  <!-- Graues Rechteck - Aktueller Knoten ist kein Kontextknoten -->	  
                  <xsl:if test="not(current()=$contextnode)">
                    <rect x="{$posX}" y="{$posY}" width="8" height="8"  style="fill:grey;"/>
                  </xsl:if>
            
                  <!-- Blaues Rechteck - Aktueller Knoten ist in nodeset Menge -->	  
                  <xsl:if test="count($nodeset//*[@id=???])">
                    <rect x="{$posX}" y="{$posY}" width="8" height="8"  style="fill:blue;"/>
                  </xsl:if>
            
                  <!-- Name des Elementes -->
                  <text x="{$posX}" y="{$posY}" dx="12 0 0 0" dy="9 0 0 0" style="font-size:10px">
                    <xsl:value-of select="name()" />
                  </text>
            	  
                </xsl:element>
            
                <xsl:apply-templates/>
              </xsl:template>
            
            
             
            </xsl:stylesheet>

            Comment


            • #7
              Mit XSLT 1.0 vergleicht man die Identität von Knoten mit generate-id, also willst du statt
              Code:
              current()=$contextnode
              eher
              Code:
              generate-id(current())=generate-id($contextnode)
              Mit XSLT 2.0 gibt es den "is"-Operator, da nimmt man
              Code:
              current() is $contextnode
              Die Existenz eines Knoten in einer Knotenmenge kann man per
              Code:
              count(node | nodeset) = count(nodeset)
              prüfen.

              Und xmlns="http://www.w3.org/2000/svg" solltest du direkt im xsl: stylesheet-Element deklarieren, damit es für Resultatselemente in allen Templates gilt.

              Comment


              • #8
                Zuerstmal vielen Dank. Stylesheet klappt super dank deiner Unterstützung

                Hier nochmals alles zusammengefasst, falls jemand das XSLT verwenden möchte.

                Verwendet eine FF4.0 oder anderen bessern Browser

                Code stellt XML Dokument als SVG Baum dar.

                p_contextnodeID .... Ist das Startelement von welchen der Baum durchwandert wird (rot). In diesen Fall
                Code:
                <element id="h-b6cf44e8-88f9-11e0-ba37-5c8176c98c64">
                p_step...Schritt welcher im Baum dargestellt wird. (blau)
                Hier kann man experimentieren!!

                Das a Element dient zur eigenen Gestaltung, bzw zur Weiterverarbeitung.

                Code:
                <!-- **
                * @NAME: SHOWSTEP
                * @DESC: Visialisierung eines Nodesets
                *        Zeigt den gesammten Nodeset in Form eines SVG Baumes 
                *        Kontextknoten+Schritt werden eingefaerbt angezeigt
                *
                * @V0.1: 2011.05.30
                *-->
                <xsl:stylesheet 
                  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                  xmlns="http://www.w3.org/2000/svg"
                  xmlns:xlink="http://www.w3.org/1999/xlink"
                  xmlns:dyn="http://exslt.org/dynamic" 
                  extension-element-prefixes="dyn">
                  
                
                  <!-- contextnodeID aus URL holen -->
                  <xsl:param name="p_contextnodeID">h-b6cf44e8-88f9-11e0-ba37-5c8176c98c64</xsl:param>
                  <!-- p_step aus URL -->
                  <xsl:param name="p_step">//*</xsl:param>
                
                
                  <!-- contextnode erzeugen -->
                  <xsl:variable name="contextnode" select="//*[@id = $p_contextnodeID]"/>
                  <!-- p_step wird eine dynamische String gebaut welche als "Schritt" verarbeited wird -->
                  <xsl:variable name="nodeset" select="dyn:evaluate(concat('$contextnode',$p_step))"/>
                  
                  <!-- Hoehe svg -->
                  <xsl:variable name="svgheight" select="count(//*)*15"/>
                
                
                  <xsl:template match="/">
                
                    <svg width="300" height="{$svgheight}"> 
                      <xsl:apply-templates/>
                    </svg>
                
                    <xsl:value-of select="$nodeset"/>
                  </xsl:template>
                
                
                  <!-- Ausgabe des Ergebnisbaumes -->
                  <xsl:template match="node()">
                
                    <xsl:variable name="pos"><xsl:number level="any" count="*"/></xsl:variable>
                    <xsl:variable name="posY" select="$pos*15"/>
                    <xsl:variable name="posX" select="count(ancestor-or-self::*[position()])*20"/>
                
                
                    <!-- Link mit parameter -->
                    <xsl:element name="a">
                      <xsl:attribute name="xlink:href" select="index.php"/>
                
                      <!-- Rotes Rechteck - Aktueller Knoten ist Kontextknoten -->
                      <xsl:if test="generate-id(current())=generate-id($contextnode)">
                        <rect x="{$posX}" y="{$posY}" width="8" height="8"  style="fill:red;"/>
                      </xsl:if>
                
                      <!-- Graues Rechteck - Aktueller Knoten ist kein Kontextknoten -->	  
                      <xsl:if test="not(generate-id(current())=generate-id($contextnode))">
                        <rect x="{$posX}" y="{$posY}" width="8" height="8"  style="fill:grey;"/>
                      </xsl:if>
                
                      <!-- Blaues Rechteck - Aktueller Knoten ist in nodeset Menge -->	  
                      <xsl:if test="count(current() | $nodeset) = count($nodeset)">
                        <rect x="{$posX}" y="{$posY}" width="8" height="8"  style="fill:blue;"/>
                      </xsl:if>
                
                      <!-- Textausgabe Elementenname -->	
                      <text x="{$posX}" y="{$posY}" dx="12 0 0 0" dy="8 0 0 0" style="font-size:10px">
                        <xsl:value-of select="name()"/>
                      </text>
                	  
                    </xsl:element>
                
                    <xsl:apply-templates/>
                  </xsl:template>
                
                
                 
                </xsl:stylesheet>

                Ich habe allerdings ein Verständnisproblem mit

                Code:
                generate-id(current())=generate-id($contextnode)
                Zuletzt editiert von mr_sol; 31.05.2011, 22:18.

                Comment


                • #9
                  Nun generate-id(current())=generate-id($contextnode) ist mit XSLT 1.0 der Weg, um die Identität der Knoten current() und $contextnode zu vergleichen, da sichergestellt ist, dass generate-id während der Ausführung eines Stylesheets für denselben Knoten auch immer dieselbe Id zurückgibt.

                  Comment


                  • #10
                    die Lernkurve geht bei mir steil nach oben. Vielen Dank

                    Comment

                    Working...
                    X