xsl:value-of mit Node "verknüpfen"

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • xsl:value-of mit Node "verknüpfen"

    Folgendes: Ich habe folgenden XML Aufbau
    Code:
    	<config>
    		<lang>1</lang>
    	</config>
    	<mainnav>
    		<item id="3" module="_shop" part="cat" state="active">
    			<name lang="1">Fische</name>
    			<name lang="2">Fishs</name>
    		</item>
    	</mainnav>
    Nun möchte ich über die vielen Punkte aus Mainnav eine for-each laufen lassen, nach dieser Art:

    Code:
    	<xsl:for-each select="/nav/mainnav/item">
    		<xsl:if test="@state = 'active'">
    			<a href="{@module}"><xsl:value-of select="name" /></a>
    		</xsl:if>
    	</xsl:for-each>
    Wie kann ich es machen, bzw. kann ich es überhaupt machen, dass nur das Node gewählt wird, wo das Attribut "lang" mit dem Wert aus der Config übereinstimmt oder ist dieser Aufbau der XML Datei unglücklich dafür?

    Danke für eure Hilfe!

    BTW: Wenn ich in <xsl:if> eine ODER/UND-Verknüpfung machen will, kann ich das dann einfach über && oder ||?
    Zuletzt geändert von Heavensdoor; 20.09.2005, 20:49.

  • #2
    dass nur das Node gewählt wird, wo das Attribut "lang" mit dem Wert aus der Config übereinstimmt
    wenn ich mich nicht irre, kannst du eine variable anlegen, die du in der abfrage verwenden kannst.
    Wenn ich in <xsl:if> eine ODER/UND-Verknüpfung machen will, kann ich das dann einfach über && oder ||?
    mal versucht?

    Kommentar


    • #3
      Re: xsl:value-of mit Node &quot;verknüpfen&quot;

      Original geschrieben von Heavensdoor
      Folgendes: Ich habe folgenden XML Aufbau
      Code:
      	<config>
      		<lang>1</lang>
      	</config>
      	<mainnav>
      		<item id="3" module="_shop" part="cat" state="active">
      			<name lang="1">Fische</name>
      			<name lang="2">Fishs</name>
      		</item>
      	</mainnav>
      Nun möchte ich über die vielen Punkte aus Mainnav eine for-each laufen lassen, nach dieser Art:

      Code:
      	<xsl:for-each select="/nav/mainnav/item">
      		<xsl:if test="@state = 'active'">
      			<a href="{@module}"><xsl:value-of select="name" /></a>
      		</xsl:if>
      	</xsl:for-each>
      Wie kann ich es machen, bzw. kann ich es überhaupt machen, dass nur das Node gewählt wird, wo das Attribut "lang" mit dem Wert aus der Config übereinstimmt oder ist dieser Aufbau der XML Datei unglücklich dafür?

      Danke für eure Hilfe!

      BTW: Wenn ich in <xsl:if> eine ODER/UND-Verknüpfung machen will, kann ich das dann einfach über && oder ||?
      So:
      Code:
      <!-- Ausgewählte Sprache "zwischenspeichern" -->
      <xsl:variable name="lang" select="/nav/config/lang"/>
      
      <xsl:for-each select="/nav/mainnav/item[@state = 'active']">
        <!-- Man beachte den XPath-Ausdruck in @select. Wählt nur den Knoten aus, auf der die richtige Sprache enthält -->
        <a href="{@module}"><xsl:value-of select="name[@lang = $lang]" /></a>
        <!-- Man könnte das $lang auch mit /nav/config/lang ersetzen, finde es aber so sauberer :D -->
      </xsl:for-each>
      Habe mir gleich mal erlaubt die if-Anweisung zu entfernen und es ist xsl:for-each/@select mit einzubauen (sollte etwas schneller sein und ist meiner Meinung nach besser zu lesen).

      Edit: Die und/oder-Verknüpfung findet nicht über &&/|| statt, sondern mit den Schlüsselworten and/or.
      Zuletzt geändert von Nezzar; 21.09.2005, 17:26.
      "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

      Kommentar


      • #4
        Original geschrieben von penizillin
        mal versucht?
        Zu der Sache mit dem && und || - ich habe es schonmal versucht. Da ich im Web aber folgendes gefunden hatte:

        <xsl:if test="{$x && $y && $z}">
        ....
        </xsl:if>

        und bei mir nur ein Fehler auftauchte wollte ich deswegen eher mal nachfragen. Hätte ja sein können, dass es nur ein Schreibfehler meiner Seite war.

        @Nezzar: Danke, für diese Info

        Kommentar


        • #5
          Soo, da bin ich wieder mit einer kleinen Erweiterung

          Ich habe mir nun einen weiteren Knoten für eine Defaultsprache erstellt und diesen auch in einer Variable oben eingelegt. Nun wollte ich folgendes realisieren:

          Wenn die gewählte Sprache vorhanden ist, wähle diese. Ansonsten die Defaultsprache.

          <xsl:value-of select="name[@lang = $lang]" />

          Hab mir erstmal gedacht, dass ich es vllt. in dem Prädikat machen kann. Jedoch gibt dieses ja nur true oder false zurück, wodurch ich sowas nicht wirklich machen kann oder?

          Die andere Möglichkeit wäre natürlich auch, dass ich halt für jede Sprache, auch wenn nichts dafür hinterlegt ist, einen eigenen Knoten eingetrage. Dadurch wird die Datei aber nur unnötig groß und dürfte den Zugriff aufs FS unnötig ausbremsen.

          Deswegen würde ich nun sehen, ob es mit einem <xsl:choose> aufbau machbar ist. Würde jedoch gerne mal eure Meinung dazu hören, ob man es damit machen kann. Den Rest mag ich mir dann selber bauen

          Kommentar


          • #6
            <xsl:choose>
            <xsl:when test="name[@lang = $lang] != ''>
            // waehle gegebene sprache
            </xsl:when>
            <xsltherwise>
            // waehle defaultsprache
            </xsltherwise>
            </xsl:choose>
            1101100 1101001 1100110 1100101 1101001 1110011 1100001 1100010 1101001 1110100 1100011 1101000

            /(bb|[^b]{2})/

            Kommentar


            • #7
              Sooo, ich habe nun dank eurer Hilfe diesen Block "geschaffen"

              Code:
              <xsl:for-each select="/nav/mainnav/item[@state = 'active' or $admin = 'yes']">
              						
              	<li>» <a href="{@module}">
              						
              	<xsl:choose>
              		<xsl:when test="name[@lang = $lang] != ''">
              			<xsl:value-of select="name[@lang = $lang]" />
              		</xsl:when>
              		<xsl:otherwise>
              			<xsl:value-of select="name[@lang = $default]" />
              		</xsl:otherwise>
              	</xsl:choose>
              						
              	</a></li>
              						
              </xsl:for-each>
              Zuletzt geändert von Heavensdoor; 22.09.2005, 22:13.

              Kommentar


              • #8
                läuft's jetzt?

                nimm bitte die drei wilden einrück-tabs aus dem code raus.

                ist "»" eigentlich validierbar?

                Kommentar


                • #9
                  Ja, es läuft nun so wie ich es erwartet habe. Zumindest ist mir noch nichts anderes aufgefallen.

                  Wie meinst du das mit dem "»" und dem validieren? Habe nirgends etwas gefunden, wo ich XSL Dateien validieren kann oder verstehe ich dich nur falsch?

                  Kommentar


                  • #10
                    Penizillin meinte vermutlich, ob das XML immer noch well-formed ist mit diesem Zeichen.
                    "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

                    Kommentar


                    • #11
                      Vielleicht reicht mein Wissen nicht soweit, aber das Zeichen steht in der XSL Datei. Wie weit soll das die XML-Datei beeinflussen?

                      Kommentar


                      • #12
                        Hallo, da bin ich wieder

                        ich habe bei mir zum testen eben mal XAMPP von ApacheFriends runtergeladen, da ich auf diesem Rechner nur kurz etwas zum testen brauchte.

                        Nun wollte ich in einer XSL Datei einen Import durchführen:
                        Code:
                        <xsl:import href="ext.xsl" />
                        Darauf erhalte ich jedoch folgende Fehlermeldung:

                        Code:
                        Warning: xsltApplyOneTemplate: import was not compiled in C:\xampp\htdocs\test\index.php on line 22
                        Jetzt bin ich natürlich etwas verwirrt. Habe mich dazu dann mal nach Google bewegt und dort auch nichts dazu gefunden :/ Was mich doch sehr gewundert hat.

                        Wüsste vllt. jmd. woran das liegen kann?

                        Kommentar


                        • #13
                          zeig mal ein paar (4-5) zeilen vor und nach dem import.

                          Kommentar


                          • #14
                            Okay, also einmal der Block wo das Template ist:

                            Code:
                            </xsl:template>
                            
                            <xsl:template name="content">
                            	<div class="content">
                            		<xsl:import href="ext.xsl" />
                            	</div>
                            </xsl:template>
                            
                            </xsl:stylesheet>
                            Dann der Punkt wo das Template aufgerufen wird:

                            Code:
                            		<xsl:apply-templates select="/nav/headnav" />
                            		<xsl:call-template name="mainnav" />
                            		
                            		<xsl:call-template name="content" />
                            		<div class="bottom"></div>
                            Ich habe nun auf php.net gelesen, dass es an z.B. Leerzeichen vor dem Import liegen. Habe ich jedoch nicht und daher bin ich auch etwas ratlos über das Problem :/

                            Kommentar


                            • #15
                              Laut der MSDN kann ein xsl:import nur direkt unterhalb von xsl:stylesheet stehen. Daran liegt's vermutlich.

                              Vielleicht reicht mein Wissen nicht soweit, aber das Zeichen steht in der XSL Datei. Wie weit soll das die XML-Datei beeinflussen?
                              XSL an sich ist ebenfalls XML. Deshalb

                              "Ach was soll's? Dann bau ich mir halt meinen eigenen Vergnügungspark mit Blackjack und Nutten." - Bender

                              Kommentar

                              Lädt...
                              X