Announcement

Collapse
No announcement yet.

Verständnisproblem beim Matchen eines Pfades

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

  • Verständnisproblem beim Matchen eines Pfades

    Hallo zusammen.

    Folgendes Problem (an dem ich seit Stunden sitze!) lässt mich daran zweifeln, dass ich XSLT/XPath verstanden habe. Leider hat meine Recherche (Google + Literatur + Kollegenkreis) meinem Verständnis in keinster Weise geholfen. Hier also das Problem:

    XML:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    
    <expression>
        <operator>
                +
        </operator>
        <number>
            1
        </number>        
        <number>
            <hex>
                5
            </hex>
        </number>    
    </expression>


    XSLT
    :

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" />
        
        <xsl:template match="/expression">
            expression: <xsl:apply-templates select="*"/>
        </xsl:template>    
            
        <xsl:template match="operator">
            operator: <xsl:value-of select="normalize-space(.)"/>
        </xsl:template>
        
        <xsl:template match="number">
            number: <xsl:value-of select="normalize-space(.)"/>
        </xsl:template>
        
        <xsl:template match="number/hex">
            number (hex): <xsl:value-of select="normalize-space(.)"/>
        </xsl:template>
        
        <xsl:template match="*"/>
    
    </xsl:stylesheet>
    Das Problem ist das letzte Template, welches number/hex matchen soll. Aber das tut es nicht. Die Ausgabe sieht wie folgt aus:

    Code:
            expression: 
            operator: +
            number: 1
            number: 5
    Auch auf die Gefahr hin, dass ich jetzt mein blaues Wunder erlebe: 1. Warum ist das so? Und 2. Was muss ich tun, dass number und number/hex (wie oben gedacht) unabhängig gematcht werden?

    Vielen Dank schon mal.

  • #2
    Vielleicht sollte ich noch erwähnen, dass direkte Adressierung keine Option ist, da sich die Expressions in meiner Anwendung beliebig tief schachteln können. Das obige Beispiel stellt nur den relevanten Part dar. Ich muss die Pfade relativ lassen...

    Comment


    • #3
      Sprich number-Elemente, welche hex-Elemente enthalten, so an:
      Code:
      <xsl:template match="number[hex]">
        number (hex): <xsl:value-of select="normalize-space(.)"/>
      </xsl:template>
      Statt dem Kontextknoten . könnte auch explizit hex stehen.

      Comment


      • #4
        Das war genau das, wonach ich gesucht habe.

        Tausend Dank!

        Warum ging number/hex nicht? Auf was wuerde denn number/hex matchen?

        Comment


        • #5
          number/hex wird einfach nicht aufgerufen, da select="*" ja nichts weiter als select="child::*" aufruft, also alle direkten Kindelementknoten. Ein select="number/hex" würde im passenden Kontext auch aufgerufen.

          Comment


          • #6
            Originally posted by Thomas Meinike View Post
            Sprich number-Elemente, welche hex-Elemente enthalten, so an:
            Code:
            <xsl:template match="number[hex]">
              number (hex): <xsl:value-of select="normalize-space(.)"/>
            </xsl:template>
            Statt dem Kontextknoten . könnte auch explizit hex stehen.
            Die Freude war doch etwas zu früh. Ich befürchte der Kontextknoten . bezieht sich bei number[hex] auf number, nicht auf hex. Es wäre jedoch sehr nützlich, gäbe es eine Möglichkeit, das Template so zu formulieren, dass . wirklich auf hex zeigt.

            Geht das irgendwie?

            Comment


            • #7
              Ich erhalte:

              expression:
              operator: +
              number: 1
              number (hex): 5

              Comment


              • #8
                Ersetze mal
                Code:
                <xsl:value-of select="normalize-space(.)"/>
                durch
                Code:
                <xsl:copy-of select="normalize-space(.)"/>
                Da sieht man, dass "." der number Knoten ist und nur deshalb 5 liefert, weil hex ignoriert wird...

                Comment


                • #9
                  Ich komme auch mit xsl:copy-of zum selben Ergebnis und sehe das Problem nicht. Was soll denn konkret erreicht werden?

                  Comment


                  • #10
                    Sorry, mein Fehler. Das normalize-space war zu viel. Probier mal bitte
                    Code:
                    <xsl:copy-of select="."/>

                    Comment


                    • #11
                      Ok, nachvollziehbar, aber das Problem selbst noch nicht. Wenn der Zugriff auf das erste Kindelement ohne Kenntnis des Namens gesucht ist, dann bietet sich child::*[1] an.
                      Zuletzt editiert von Thomas Meinike; 09.03.2009, 18:56.

                      Comment


                      • #12
                        Nur eine Frage der Faulheit. Wenn ich z.B. so ein Template habe:

                        Code:
                            <xsl:template match="number[decimal[value]]">...
                        
                        muss ich den Knoten, an den ich eigentlich ran will, mit

                        Code:
                        <xsl:value-of select="normalize-space(decimal/value)"/>
                        ansprechen. Das ist unschön, weil doppelte Schreibarbeit. Ändere ich jetzt mal die Bezeichnungen der Knoten muss ich das überall zwei Mal machen. Ist kein großes Problem - nur nicht sonderlich elegant.

                        Comment

                        Working...
                        X