Announcement

Collapse
No announcement yet.

DOM Struktur per select ausgeben?

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

  • DOM Struktur per select ausgeben?

    Moin,
    kann ich mit mit <p><xsl:value-of select="thisPath" /></p> irgendwie den kompletten Pfad im DOM-Baum augeben lassen? Und wenn ja, auch wenn das select innerhalb eines template steht?
    Als Ergebnis stelle ich mir z.B. vor: "root/person/name/vorname"

    Danke,
    Paul

  • #2
    Das ist über die Vorfahren-Achsen ancestor bzw. ancestor-or-self möglich:
    Code:
    <xsl:template match="/">
      <xsl:apply-templates select="//*"/>
    </xsl:template>
    
    <xsl:template match="*">
      <xsl:for-each select="ancestor-or-self::*">
        <xsl:value-of select="name()"/>
        <xsl:if test="position() != last()"><xsl:text>/</xsl:text></xsl:if>
        <xsl:if test="position() = last()"><xsl:text>&#xA;</xsl:text></xsl:if>
      </xsl:for-each>
    </xsl:template>
    Für das Beispiel
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
      <test>
        <a>
          <b>
            <c>...</c>
          </b>
        </a>  
      </test>
    </root>
    ensteht dieses Ergebnis:

    root
    root/test
    root/test/a
    root/test/a/b
    root/test/a/b/c

    Comment


    • #3
      Vielen Dank! Genau das hab ich gesucht.
      Wo findet man denn eine Übersicht über alle möglichen select-Anweisungen?

      Paul

      Comment


      • #4
        Die 1.0-Versionen von XSLT/XPath werden in SELFHTML gut beschrieben. Ein in jeder Hinsicht »erschlagendes« Buch ist bei intensiver Nutzung der Technologien (hier speziell 2.0) empfehlenswert.

        Comment


        • #5
          Vielen Dank!

          kann man auch folgendes Konstrukt mit eindeutigen Pfaden auslesen?

          Code:
          <?xml version="1.0" encoding="UTF-8"?>
          <root>
            <test>
              <a>
                <b>
                  <c>1</c>
                </b>
              </a>  
              <a>
                <b>
                  <c>2</c>
                </b>
              </a> 
            </test>
          </root>
          Also damit man dann für eine xpath query z.B: 'root/test/a[position()=2]/b/c' erhält?
          Paul
          Zuletzt editiert von Paul; 17.03.2010, 16:46.

          Comment


          • #6
            Ansatz (auf position()=2 habe ich hier zugunsten von [2] verzichtet):
            Code:
            <xsl:template match="*">
              <xsl:for-each select="ancestor-or-self::*">
                <xsl:variable name="name" select="name()"/>
                <xsl:variable name="count" select="count(preceding-sibling::*[name() = $name]) + 1"/>
                <xsl:choose>
                  <xsl:when test="$count > 1"><xsl:value-of select="concat($name,'[',$count,']')"/></xsl:when>
                  <xsl:otherwise><xsl:value-of select="$name"/></xsl:otherwise>
                </xsl:choose>    
                <xsl:if test="position() != last()"><xsl:text>/</xsl:text></xsl:if>
                <xsl:if test="position() = last()"><xsl:text>&#xA;</xsl:text></xsl:if>
              </xsl:for-each>
            </xsl:template>
            Ergebnis:

            root
            root/test
            root/test/a
            root/test/a/b
            root/test/a/b/c
            root/test/a[2]
            root/test/a[2]/b
            root/test/a[2]/b/c

            Comment


            • #7
              Wow!!!
              Das hilft mir echt weiter - Danke!

              Dazu ne kleine Frage: was bewirkt das &#xA; ? Bei mir kommt da dann immer nur ein störendes Leerzeichen.

              Paul

              Comment


              • #8
                Das ist ein Zeilenumbruch (line feed aka \n).

                Comment


                • #9
                  Auf die Gefahr hin das ich dich nerve:

                  Beim ersten a aus dem Beispiel steht kein [1]. Deshalb wird der erste tag nicht über eine xpath query gefunden. Wenn ich allerdings überall die position dranhänge, gibt's auch Fehler. Ich bräuchte also eine Position wenn's von diesem tag mehr als eins gibt ?

                  Comment


                  • #10
                    Dann entferne den xsl:choose-Block und verwende nur:
                    Code:
                    <xsl:value-of select="concat($name,'[',$count,']')"/>

                    Comment


                    • #11
                      Hallo Thomas,
                      dann bekommt jedes Element eine [1] auch wenn es keine weiteren identische tags gibt.

                      Ich hab mich mal selber versucht, wäre schön wenn Du nur kurz "ok so" oder "totaler sch..." dazu sagen könntest:

                      Code:
                        <xsl:for-each select="ancestor-or-self::*">
                          <xsl:variable name="name" select="name()"/>
                          <xsl:variable name="count" select="count(preceding-sibling::*[name() = $name]) + 1"/>
                          <xsl:variable name="count2" select="count(following-sibling::*[name() = $name]) + 1"/>
                          <xsl:choose>
                            <xsl:when test="($count2 > 1) and ($count = 1)"><xsl:value-of select="concat($name,'[1]')"/></xsl:when>
                            <xsl:otherwise>
                              <xsl:choose>
                                <xsl:when test="$count > 1"><xsl:value-of select="concat($name,'[',$count,']')"/></xsl:when>
                                <xsl:otherwise><xsl:value-of select="$name"/></xsl:otherwise>         
                              </xsl:choose>
                             </xsl:otherwise> 
                          </xsl:choose>    
                          <xsl:if test="position() != last()"><xsl:text>/</xsl:text></xsl:if>
                          <xsl:if test="position() = last()"><xsl:text>&#xA;</xsl:text></xsl:if>
                        </xsl:for-each>
                      Vielen Dank noch mal für Deine Hilfe,
                      Paul

                      Comment

                      Working...
                      X