2017-04-07 5 views
2

Ich versuche, eine eindeutige nach einer Gruppierung zu tun, und es funktioniert nicht. Mit diesem Knoten:XSLT 1 eindeutige Gruppierung

<MAIN> 
    <VALUE>A</VALUE> 
    <VALUE>B</VALUE> 
    <VALUE>AB</VALUE> 
    <VALUE>A</VALUE> 
    <VALUE>AB</VALUE> 
</MAIN> 

ich die folgende XPath verwenden:

MAIN/VALUE[not(following::VALUE/text() = text())] 

, und ich habe meine unterschiedlichen Werte B, AB, A. Aber wenn ich den folgenden Knoten:

<MAIN> 
    <BLOC> 
     <TYP>1</TYP> 
     <VALUE>A</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>1</TYP> 
     <VALUE>BA</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>1</TYP> 
     <VALUE>B</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>1</TYP> 
     <VALUE>A</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>2</TYP> 
     <VALUE>A</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>2</TYP> 
     <VALUE>C</VALUE> 
    </BLOC> 
</MAIN> 

ich versuche, von TYP zu einer Gruppe vor dem deutlichen tun:

MAIN/BLOC[TYP=1]/VALUE[not(following::VALUE/text() = text())] 

Es funktioniert nicht, ich habe BA und B, aber ohne A.

wenn ich versuche, dass:

MAIN/BLOC[TYP=1]/VALUE 

die Gruppe durch Rückkehr alle Werte meiner TYP.

Warum funktioniert das distinct nach der Gruppierung nicht?

Antwort

1

Sie müssen die Prüfung auf TYP=1 in die Prüfung auf dem folgenden Knoten auch einschließen. Im Moment wird die zweite „A“ abgeholt nicht, weil es einen folgenden Knoten hat auch von „A“

MAIN/BLOC[TYP=1]/VALUE[not(following::BLOC[TYP=1]/VALUE/text() = text())] 

Ich nehme zur Kenntnis, dass Sie diese XSLT markiert haben, und erwähnt XSLT im Titel. In diesem Fall sollten Sie eine Technik namens Muenchian Grouping verwenden, um bestimmte Elemente zu erhalten.

Zunächst definieren ein Schlüssel wie so

<xsl:key name="blocs_by_value" match="BLOC" use="VALUE" /> 

Dann die unterschiedlichen VALUE Knoten zu bekommen, tun dies

<xsl:value-of select="MAIN/BLOC[generate-id() = generate-id(key('blocs_by_value', VALUE)[1])]/VALUE" /> 

Für den Fall, dass Sie verschiedene VALUE Knoten für eine bestimmte erhalten möchten Geben Sie den Schlüssel wie folgt ein:

<xsl:key name="blocs_by_typ_value" match="BLOC" use="concat(TYP, '|', VALUE)" /> 

Dann ist der Ausdruck, um verschiedene Werte zu erhalten, dies. ..

<xsl:value-of select="MAIN/BLOC[TYP=1][generate-id() = generate-id(key('blocs_by_typ_value', concat(TYP, '|', VALUE))[1])]/VALUE" /> 
Verwandte Themen