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.

XPath: distinct-values

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
Beschreibung: 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 / 5. November 2017



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