XPath 3.0, XPath 2.0, XPath 1.0 / XPath Funktionen / XPath: Sequence-Funktionen / XPath: distinct-values

XPath: distinct-values

XPath: distinct-values

➪ Die XPath-Funktion "distinct-values" löscht mehrfache identische Einträge in einer Sequence und reduziert die Ausgabe auf Einzelresultate.

Wenn es darum geht, mehrfach vorkommende Einzelwerte zu , als so zusammenzufassen, daß sie jeweils nur einmal auftreten, steht auch die Funktion "distinct-values" zur Verfügung.


<xsl:for-each select="distinct-values(//Kauf/bez)">
    <Artikel name="{.}"/>
</xsl:for-each>

Als Ergebnis finden wir:


   <Artikel name="Hemd"/>
   <Artikel name="Hose"/>
   <Artikel name="Schuhe"/>

Freilich geht in diesem Moment der Zugriff auf die Datenquelle verloren:


<xsl:for-each 
     select="distinct-values(//Kauf/bez)">
    <xsl:variable 
         name="vartikel" select="."/>
    <Artikel name="{$vartikel}">
        <xsl:for-each 
             select="//Mensch[Kauf/bez=$vartikel]">
            <kunde/>
        </xsl:for-each>
    </Artikel>
</xsl:for-each>

Diesen Aufruf würde der XSL-Prozessor mit einem netten Gruß aus der Beschwerdeabteilung quittieren.


Fehlerlevel: fatal
XPTY0020: Leading '/' 
         cannot select the root node 
         of the tree containing the 
         context item: the context 
         item is not a node
URL: http://www.w3.org/TR/xpath20/#ERRXPTY0020

Ein suboptimaler, aber dennoch funktionierender Ausweg wäre, den gesamten XML Input in eine Variable zu verpacken und die weitere Verarbeitung auf dieser Variablen zu gründen.


<xsl:variable 
     name="vinput" select="."/>
<xsl:for-each 
     select="distinct-values(//Kauf/bez)">
    <xsl:variable 
         name="vartikel" select="."/>
    <Artikel name="{$vartikel}">
        <xsl:for-each 
             select="$vinput//Mensch[Kauf/bez=$vartikel]">
            <kunde nn="{name}" 
                   vn="{vorname}" 
                   wo="{../name}"/>
        </xsl:for-each>
    </Artikel>
</xsl:for-each>

wg / 8. Februar 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

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

www.wilfried-grupe.de/distinctvalues.html