2017-01-27 1 views
1

diese Quelle XML Betrachten:für-jeden-Gruppe und Art (aber einige Werte ignorieren)

<root> 
    <value price="50"> 
    <type name="bike"/> 
    <interesting value="no"/> 
    </value> 
    <value price="1"> 
    <type name="car"/> 
    <interesting value="no"/> 
    </value> 
    <value price="123"> 
    <type name="bike"/> 
    <interesting value="yes"/> 
    </value> 
    <value price="234"> 
    <type name="bike"/> 
    <interesting value="yes"/> 
    <pedals madeof="gold" /> 
    </value> 
    <value price="150"> 
    <type name="car"/> 
    <interesting value="yes"/> 
    </value> 
</root> 

Jetzt würde ich alle Fahrräder Gruppe mögen und alle Autos zusammen, aber die Reihenfolge der Preis sein sollte (billig zu teuer) aber nur unter Berücksichtigung der Fahrräder und Autos mit <interesting value="yes"/>.

Mein XSLT ist

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> 
    <xsl:output indent="yes"/> 
    <xsl:template match="/"> 
    <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="root"> 
    <out> 
     <xsl:for-each-group select="value" group-by="type/@name"> 
     <xsl:sort select="@price" data-type="number"/> 
     <elt> 
      <xsl:attribute name="grouping-key" select="current-grouping-key()"/> 
      <xsl:attribute name="min-price" select="@price"/> 
     </elt> 
     </xsl:for-each-group> 
    </out> 
    </xsl:template> 
</xsl:stylesheet> 

Welche Filter für die <interesting value="yes"/> ignoriert. Das Ergebnis ist

<out> 
    <elt grouping-key="car" min-price="1"/> 
    <elt grouping-key="bike" min-price="50"/> 
</out> 

aber es sollte

<out> 
    <elt grouping-key="bike" min-price="123"/> 
    <elt grouping-key="car" min-price="150"/> 
</out> 

sein, weil die bike[interesting/@value='yes'] ist billiger als die car[interesting/@value='yes']

Es kann mehr als zwei Arten von jedem Fahrzeug sein und mehr Einträgen mit interesting="yes".

Wie kann ich nach dem Preis sortieren, sondern nur diejenigen berücksichtigen, die "interessant" sind?

Antwort

1

Die Lösung wahrscheinlich komplizierter ist, als es sein sollte, aber hier ist es ist:

<xsl:for-each-group select="value" group-by="type/@name"> 
    <xsl:sort select="not(empty(current-group()[interesting[@value = 'yes']]))" order="descending"/> 
    <xsl:sort select="(min(current-group()[interesting[@value = 'yes']]/xs:integer(@price)), min(current-group()/xs:integer(@price)))[1]" data-type="number"/> 

    <xsl:variable name="sorted-items" as="node()*"> 
     <xsl:perform-sort select="current-group()"> 
     <xsl:sort select="interesting[@value = 'yes']" order="descending"/> 
     <xsl:sort select="@price" data-type="number"/> 
     </xsl:perform-sort> 
    </xsl:variable> 

    <elt> 
     <xsl:attribute name="grouping-key" select="current-grouping-key()"/> 
     <xsl:attribute name="min-price" select="$sorted-items[1]/@price"/> 
    </elt> 
</xsl:for-each-group> 
+0

Ich habe Ihre Lösung versucht, die gut funktioniert, bis ich einen anderen "interessanten" Eintrag für Fahrrad habe. Siehe meine überarbeitete Frage (ich habe dort einen anderen Abschnitt eingefügt). Ich erhalte den Fehler 'XTETE1020: Eine Folge von mehr als einem Artikel ist nicht erlaubt als @select-Attribut von xsl: sort'. – topskip

+0

@topskip aktualisiert –

+0

Sorry für die späten "akzeptieren", aber vielen Dank noch einmal für Ihre Antwort. – topskip

1

einfach die Elemente filtern Sie durch Hinzufügen eines Prädikats in Ihrem <xsl:for-each-group wählen:

<xsl:for-each-group select="value[interesting/@value='yes']" group-by="type/@name"> 

Das Ergebnis ist:

<?xml version="1.0" encoding="UTF-8"?> 
<out> 
    <elt grouping-key="bike" min-price="123"/> 
    <elt grouping-key="car" min-price="150"/> 
</out> 
+0

Das Problem mit dieser Lösung ist, dass es nichts ausgibt, wenn es keine * interessante * es gibt ems. –

+0

@MaxToro - Ist das wirklich ein Problem? Nur das OP kann sicher sagen, aber da "nur diejenigen betrachten, die" interessant "sind", würde ich denken, das größere Problem wäre, etwas in die Ausgabe aufzunehmen, die nicht "interessant/@ value =" yes hat "". +1 –

Verwandte Themen