Wolfgang Schlaupitz: XSLT-Problem (parent/pfad/position)

Hallo,

ich komme hier nicht weiter:

ich möchte innerhalb eines templates folgende Werte ermitteln:
(die Elemente kann ich über absolute Pfade ermitteln)

  1. Liefere mir von einem Element mit einem bestimmten Attributwert (z.b. id=1) den Positionswert [position()] des Vaterelements.

2. Liefere mir von einem Element mit einem bestimmten Attributwert (z.b. id=1) den Positionswert [position()] des Vaterelements des Vaterelements.

Meine bisherigen Versuchen scheiterten alle:
z.B.: value-of select = [parent][Pfad des Elements mit Attribut] [position()]

Wie kann ich so etwas (Punkt 1 und 2) in XSLT schreiben?

Danke mal und Grüsse

Wolfgang

  1. Hallo,

    ich komme hier nicht weiter:

    ich möchte innerhalb eines templates folgende Werte ermitteln:
    (die Elemente kann ich über absolute Pfade ermitteln)

    1. Liefere mir von einem Element mit einem bestimmten Attributwert (z.b. id=1) den Positionswert [position()] des Vaterelements.
    1. Liefere mir von einem Element mit einem bestimmten Attributwert (z.b. id=1) den Positionswert [position()] des Vaterelements des Vaterelements.

    Meine bisherigen Versuchen scheiterten alle:
    z.B.: value-of select = [parent][Pfad des Elements mit Attribut] [position()]

    Wie kann ich so etwas (Punkt 1 und 2) in XSLT schreiben?

    Das könntest du nur erreichen, wenn du für die parent-Elemente die Position in einer Variable speicherst und diese dann später ausgibtst.
    Da ich aber dein XSL nicht kenne und so nicht weiss, ob und welche Templates du für die parent-Elemente hast, ist es schwer zu sagen was du machen sollst.
    Eventuell hilft dir ein:
    <xsl:template match="element">
     <xsl:if test="@id = 1">
      <xsl:for-each select="parent::*">
       <xsl:value-of select="position()" />
      </xsl:for-each>
     </xsl:if>
    </xsl:template>

    Grüße
    Thomas

    1. Hallo,

      ich komme hier nicht weiter:

      ich möchte innerhalb eines templates folgende Werte ermitteln: (die Elemente kann ich über absolute Pfade ermitteln)

      1. Liefere mir von einem Element mit einem bestimmten Attributwert (z.b. id=1) den Positionswert [position()] des Vaterelements.
      1. Liefere mir von einem Element mit einem bestimmten Attributwert (z.b. id=1) den Positionswert [position()] des Vaterelements des Vaterelements.

      Meine bisherigen Versuchen scheiterten alle: z.B.: value-of select = [parent][Pfad des Elements mit Attribut] [position()]

      Wie kann ich so etwas (Punkt 1 und 2) in XSLT schreiben?

      Das könntest du nur erreichen, wenn du für die parent-Elemente die Position in einer Variable speicherst und diese dann später ausgibtst. Da ich aber dein XSL nicht kenne und so nicht weiss, ob und welche Templates du für die parent-Elemente hast, ist es schwer zu sagen was du machen sollst. Eventuell hilft dir ein: <xsl:template match="element"> <xsl:if test="@id = 1">   <xsl:for-each select="parent::*">    <xsl:value-of select="position()" />   </xsl:for-each> </xsl:if> </xsl:template>

      Grüße Thomas

      Danke mal - werde versuchen ob ich durch diesen Ansatz weiterkomme. Andere Lösungen sind aber auch willkommen. Kurz zur Problematik: Ich habe ein Element ohne Attributwerte. Dieses Element kann an unterschiedlichen Stellen und unterschiedlich oft im Baum vorkommen. Das Kindelement dieses Elements bzw. das Kindlement des Kindelements dieses Elements hat eine eindeutige ID als Attribut. Aus Gründen der Verlinkung benötigt nun dieses Element nun eine eindeutige ID. Dies habe ich über die Funktion position() erreicht. An einer anderen Stelle des Baumes gibt es nun ein Element - ich nenne es jetzt mal "Linkelement", welches diese eindeutige ID benötigt. Im Linkelement ist die Attribut-ID des Kindelements bzw. des Kindelements des Kindelements bekannt. Wie schaffe ich es nun diese (Positions-)-ID an das "Linkelement" zu übergeben?

      Viele Grüsse Wolfgang

      1. Hallo,

        Danke mal - werde versuchen ob ich durch diesen Ansatz weiterkomme.
        Andere Lösungen sind aber auch willkommen.
        Kurz zur Problematik:
        Ich habe ein Element ohne Attributwerte.
        Dieses Element kann an unterschiedlichen Stellen und unterschiedlich oft im Baum vorkommen.
        Das Kindelement dieses Elements bzw. das Kindlement des Kindelements dieses Elements hat eine eindeutige ID als Attribut.
        Aus Gründen der Verlinkung benötigt nun dieses Element nun eine eindeutige ID.
        Dies habe ich über die Funktion position() erreicht.
        An einer anderen Stelle des Baumes gibt es nun ein Element - ich nenne es jetzt mal "Linkelement", welches diese eindeutige ID benötigt. Im Linkelement ist die Attribut-ID des Kindelements bzw. des Kindelements des Kindelements bekannt.
        Wie schaffe ich es nun diese (Positions-)-ID an das "Linkelement" zu übergeben?

        In dem Fall ist position() die schlechtere Wahl, vor allem weil du darauf nicht wirklich zugreifen kannst.

        generate-id()(link:http://de.selfhtml.org/xml/darstellung/xpathfunktionen.htm#generate_id]) ist hier die geignetere Möglichkeit, da du dadurch eine dokumentweit eindeutige ID bekommst (und auch wenn du mehrmals diese Funktion aufrufst: ein bestimmter Knoten erhält immer dieselbe ID zugewiesen).

        Zudem kannst du die Funktion von jeder Stelle auf ausrufen:
        z.B: value-of select="generate-id(vaterelement[element[@id = 1]])"

        Aber es wäre einfacher, wenn du einen Auszug aus deinem XML und XSL zeigen würdest.

        Grüße
        Thomas

        1. Vielen Dank für den Tip.

          Ich werde mir das mal anschauen.

          Gruss

          Wolfgang

          1. Danke schön,

            über die generate-id() hab ichs hinbekommen!

            Gruss

            Wolfgang