Announcement

Collapse
No announcement yet.

kompletter XPath vom root Element bis zum jetzigen Knoten

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

  • kompletter XPath vom root Element bis zum jetzigen Knoten

    Hallo Leute,

    mein Problem stellt sich so dar:
    Ich soll im Rahmen meiner Diplomarbeit unter anderem ein webbasierten Editor schreiben, welcher ein XSD-File einliest und mittels XSLT dieses XSD-File in ein Editor umformt. Nachdem alle Textfelder etc. ausgefüllt sind, soll aus den Formulardaten ein XML-Datenfile (XML-File) entstehen. Um nun die Textfelder eindeutig einem Schemaelement zuzuordenen, möchte ich gerne bei der Transformation jedem Element (Textfeld, Radiobutton, Selectboxen, etc.) einen eindeutigen Namen verpassen. Ich stelle mir das folgender Maßen vor. Der Name soll einfach den XPath vom rootelement bis zum aktuellen Contextknoten enthalten.

    Beispiel: Pseudocode:

    <xs:schema ...>
    <xs:element name="Profileditor">
    <xs:complexType>
    <xs:sequence>
    ....
    <xs:element name="Informations">
    <xs:complexType>
    <xs:choice>
    ...
    -- Hier befinde ich mich bei der Transformation --
    ...
    <xs:choice>
    </xs:complexType>
    </xs:element>
    <xs:attribute name="label" type="xs:string">
    ....
    -- Oder ich befinde mich bei der Transformation --
    ....
    </xs:attribute>
    </xs:complexType>
    </xs:element>
    </xs:schema>

    So in dem XSLT-File habe ich innerhalb der Templates eine Variable deffiniert, zB.: xpath
    Jeden Knoten möchte ich mit einem Punktz trennen. Bei diesem Beispiel kann ich mir dann folgenden Namen für die Webkomponenten vorstellen:

    Profileditor.Informations
    Profileditor.Informations.label_attr

    Funktioniert das irgenwie mit ancestor-or-self und einer for-each Schleife? Schön wäre es, bei jedem Durchlauf das Ergebnis an die Varibale $xPath anzusetzen.

    Vielleicht habt ihr ja auch ein Funktion auf Lager mit dem man sich den ganzen Kram sparen kann.

    cu
    Christian

  • #2
    Hallo Christian,

    im Anhang ein XSLT 1.0-Stylesheet, welches ein benanntes Templates namens path implementiert, welches wiederum für ein beliebiges Element (im Parameter node) den jeweiligen Pfad liefert.

    Viele Grüße und noch viel Erfolg mit der Diplomarbeit!

    Martin
    www.aboutxml.d
    Martin Szugat
    www.aboutxml.de

    Comment


    • #3
      Thanks.

      Aber leider ist der Code (bzw.) der Link tod. Bitte kopiere mir die Stellen oder das Dokument hier mit rein. Danke.

      c

      Comment


      • #4
        Aus leidvoller Erfahrung weiß ich, dass XML-Code im Forum als HTML-Code interpretiert wird. Daher auf diesem Weg:

        http://www.aboutxml.de/path.xsl

        :
        Martin Szugat
        www.aboutxml.de

        Comment


        • #5
          Hi ich noch einmal,

          mit <xsl:template match="//a"> greife ich ja auf alle a-Tags im Dokument zu. Wie kann ich aber den Pfadnamen abgreifen oder wo steht er drin. Is schön wenn du mir auch noch bei dieser Frage helfen könntest. In meiner ersten Massage stand ja das ich denn Pfad als Variblee haben möchte, diese lese ich aus und weis sie meiner Webkomponente zu. Des Weiteren besteht der Vorteil später die Webelemente der Formularseite über das Request-Objekt besser auswerten zu können. Ich denke einfach einen DOM-Baum erzeugen und die Webelementnamen auswerten.
          Ich find es super das deine Antworten sehr schnell kommenIst das bei den anderen Foren auch so?

          ok ich wünsch dir nen guten Fussballabend bis dann.

          Christian.

          PS:
          Andere Poster sind herzlich eingeladen

          Comment


          • #6
            Hallo Christian,

            Um den Pfadnamen als Variable zu haben, musst Du den Aufruf des benannten Templates einfach in ein xsl:variable-Element einschließen. Ich habe die Datei http://www.aboutxml.de/path.xsl entsprechend erweitert. Außerdem zeigt das Beispiel jetzt, wie man für alle Elemente eines beliebigen XML-Dokuments die Pfadnamen ausgibt (als HTML-Dokument).

            Viele Grüße

            Martin

            PS: Andere Foren: keine Ahnung.

            PPS: Leider kein Fussballabend. Bin selbst noch Student und sitze gerade vor Hausaufgaben :
            Martin Szugat
            www.aboutxml.de

            Comment


            • #7
              Hi,

              ich habe mich heute morgen mal an das PRoblem rangesetzt. Folgendes ist dabei herausgekommen:

              <xsl:template name="path">
              <xslaram name="node"/>
              <xsl:choose>
              <xsl:when test="string-length(name($node/..)) &gt; 0">

              <xsl:variable name="name" select="$node/@name"/>
              <xsl:variable name="path">
              <xsl:call-template name="path">
              <xsl:with-param name="node" select="$node/.."/>
              </xsl:call-template>
              </xsl:variable>
              <xsl:choose>
              <xsl:when test="$node/@name != '' ">
              <xsl:value-of select="concat($path, '.', $name)"/>
              </xsl:when>
              <xsltherwise>
              <xsl:value-of select="$path"/>
              </xsltherwise>
              </xsl:choose>
              </xsl:when>
              <xsltherwise>

              <xsl:value-of select="$node/@name"/>
              </xsltherwise>
              </xsl:choose>
              </xsl:template>

              Und das Code-Fragment sieht dann so aus:

              <xsl:variable name="tempXPath">
              <xsl:call-template name="path">
              <xsl:with-param name="node" select="."/>
              </xsl:call-template>
              </xsl:variable>
              <xsl:variable name="completeXPath">
              <xsl:value-of select="substring($tempXPath,2,string-length($tempXPath))"/>
              </xsl:variable>

              Die letzte Zeile schneidet mir nur das erste Zeichen (.) ab.
              Und hier noch ne kleine Anwendung:

              <xsl:choose>
              <xsl:when test="string($typeName) = 'xs:boolean'">
              <xsl:if test="parent::node()/@use = 'required' ">
              <input type="radio" name="{$completeXPath}" value="0" checked="true"/>false<br/>
              <input type="radio" name="{$completeXPath}" value="1"/>true<br/>
              </xsl:if>
              <xsl:if test="parent::node()/@use = 'prohibited' ">
              <input type="radio" name="{$completeXPath}" value="0" disabled="true"/>false<br/>
              <input type="radio" name="{$completeXPath}" value="1" disabled="true"/>true<br/>
              </xsl:if>
              <xsl:if test="parent::node()/@use = 'optional' ">
              <input type="radio" name="{$completeXPath}" value="0"/>false<br/>
              <input type="radio" name="{$completeXPath}" value="1"/>true<br/>
              </xsl:if>
              </xsl:when>
              <xsl:when test="string($typeName) = 'xs:int'">
              <input value="0" type="text" id="{string(parent::node()/@id)}"
              name="{$completeXPath}"
              onchange="validiereTextbox(this.value)"/>
              </xsl:when>
              <xsl:when test="string($typeName) = 'xs:string'">
              <input value="Texteingabe" type="text" id="{string(parent::node()/@id)}"
              name="{$completeXPath}"/>
              </xsl:when>
              <xsltherwise>-- TODO --</xsltherwise>
              </xsl:choose>

              Bitte schaut in dem Forum die nächste Diskusion an:
              "dynamische Elemente im Webeditor erzeugen"

              Bis den

              Comment

              Working...
              X