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

XPath: distinct-values

XPath: distinct-values

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

Wenn es darum geht, mehrfach vorkommende Einzelwerte zu , also so zusammenzufassen, dass 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 Sie:


<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>

Siehe auch .

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/distinctvalues.html