XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Achsen / Automatische Generierung des XPath-Statements

Automatische Generierung des XPath-Statements

Automatische Generierung des XPath-Statements

XPath-Pfade und Achsen definieren den Verlauf, Umfang und Richtung, in dem die umgebenden Nodes abgearbeitet werden.

Durchaus einen genaueren Blick wert ist der folgende Ansatz, der jeden einzelnen Menschen im Dokument durchläuft und zu jedem einzelnen das komplette XPath-Statement generiert. Ausgehend von jedem einzelnen Mensch-Node, wird mit ancestor-or-self::* ein Loop bis zum Rootnode durchlaufen und deren Namen (<xsl:value-of select="name()" />) ermittelt (den Rootnode zuerst).

Wenn der jeweilige Parent-Node einen zweiten (also mehrere) Childnode besitzt (<xsl:if test="../*[2]">), wird das Prädikat (z.B. [2]) dadurch generiert, daß die vorhergehenden Nodes gleichen Namens (preceding-sibling::*[name(.)=name(current())]) gezählt und um den Wert 1 addiert werden (count( ... ) + 1).

Die Verwendung von und wird auf den Folgeseiten näher erläutert.


<xsl:template name="generateXPath">
 <xsl:for-each select="ancestor-or-self::*">
  <xsl:text>/</xsl:text>
  <xsl:value-of select="name()" />
  <xsl:if test="../*[2]">
   <xsl:text>[</xsl:text>
   <xsl:value-of
    select="count(preceding-sibling::*
           [name(.)=name(current())]) + 1" />
   <xsl:text>]</xsl:text>
  </xsl:if>
 </xsl:for-each>
</xsl:template>

Um eine Liste aller XPath-Statements für jedes einzelne Mensch-Element zu erhalten, können wir dieses Template aufrufen:


  <xsl:template match="/">
    <ergebnis>
      <xsl:for-each 
           select="/Orte/Ort/Mensch">
        <e nr="{position()}">
          <xsl:call-template 
               name="generateXPath"/>
        </e>
      </xsl:for-each>
    </ergebnis>
  </xsl:template>

Die generierten Pfade sehen dann z.B. so aus:


<ergebnis>
  <e nr="1">/Orte/Ort[1]/Mensch[1]</e>
  <e nr="2">/Orte/Ort[1]/Mensch[2]</e>
  <e nr="3">/Orte/Ort[1]/Mensch[3]</e>
  <e nr="4">/Orte/Ort[1]/Mensch[4]</e>
  <e nr="5">/Orte/Ort[1]/Mensch[5]</e>
  <e nr="6">/Orte/Ort[1]/Mensch[6]</e>
  <e nr="7">/Orte/Ort[2]/Mensch[1]</e>
  <e nr="8">/Orte/Ort[2]/Mensch[2]</e>
  <e nr="9">/Orte/Ort[2]/Mensch[3]</e>
  <e nr="10">/Orte/Ort[2]/Mensch[4]</e>
  <e nr="11">/Orte/Ort[2]/Mensch[5]</e>
  <e nr="12">/Orte/Ort[2]/Mensch[6]</e>
  <e nr="13">/Orte/Ort[3]/Mensch[1]</e>
  <e nr="14">/Orte/Ort[3]/Mensch[2]</e>
  <e nr="15">/Orte/Ort[3]/Mensch[3]</e>
  <e nr="16">/Orte/Ort[3]/Mensch[4]</e>
  <e nr="17">/Orte/Ort[3]/Mensch[5]</e>
  <e nr="18">/Orte/Ort[3]/Mensch[6]</e>
  <e nr="19">/Orte/Ort[3]/Mensch[7]</e>
</ergebnis>

wg / 7. Januar 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/XPath_Achsen1.html