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

➪ Der gezielte Einsatz von ancestor-or-self::*, preceding-sibling::*, wahlweise auch in Kombination mit descendant-or-self::* erlaubt, den XPath jedes Elements in einem XML-Dokument zu ermitteln. Das ist hilfreich für die Entwicklung und das professionelle Testen von XSL-Stylesheets sowie XQuery.

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, dass die vorhergehenden Nodes gleichen Namens (preceding-sibling::*[name(.)=name(current())]) gezählt und um den Wert 1 erhöht werden (count( ... ) + 1).

Siehe und .


<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 Sie 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 / 30. April 2018



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


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

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XPath_Achsen1.html