XSLT Ignorieren Sie doppelte Elemente zu
Ich habe gerade angefangen zu lernen, XSLT und habe Probleme ignorieren duplizierten Elementen.
Habe ich die Suche durch Stack-Overflow und habe gesehen, dass Leute Fragen ähnliche Fragen. Ich habe versucht, ein kleines Beispiel, um zu sehen, wo ich gelaufen war, auf meine Datei, und war in der Lage, Sie zu ignorieren duplizierten Elementen. Aber das problem bei mir scheint zu entstehen, wenn ich mehr als einen Typ eines Elements.
Beispiel:
File1.xml
<?xml-stylesheet type="text/xsl" href="merge2.xsl"?>
<Main>
<Records>
<Record>
<Description>A</Description>
</Record>
<Record>
<Description>A</Description>
</Record>
<Record>
<Description>B</Description>
</Record>
<Record>
<Description>C</Description>
</Record>
</Records>
</Main>
merge2.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<table border="1">
<tr>
<th>Type</th>
<th>Count</th>
</tr>
<xsl:for-each select="Main/Records/Record">
<xsl:if test ="not(preceding-sibling::Record(Description/text() = current()/Description/text()])">
<tr>
<td><xsl:value-of select="Description"/></td>
<td><xsl:value-of select="count(//Record[Description/text()=current()/Description/text()])"/></td>
</tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Dies funktioniert gut und gibt mir die gewünschten Ergebnisse.
Type Count
A 2
B 1
C 1
Jedoch wenn ich eine weitere hinzufügen-Datensätze-element scheint es für die beiden eine nach der anderen, z.B.
<?xml-stylesheet type="text/xsl" href="merge2.xsl"?>
<Main>
<Records>
<Record>
<Description>A</Description>
</Record>
<Record>
<Description>A</Description>
</Record>
<Record>
<Description>B</Description>
</Record>
<Record>
<Description>C</Description>
</Record>
</Records>
<Records>
<Record>
<Description>B</Description>
</Record>
<Record>
<Description>A</Description>
</Record>
<Record>
<Description>C</Description>
</Record>
<Record>
<Description>C</Description>
</Record>
</Records>
</Main>
Diese produzieren würde, die folgenden.
Type Count
A 3
B 2
C 3
B 2
A 3
C 3
Wo es scheint, um Prozess der ersten Instanz von Aufzeichnungen, die dann auf den nächsten Zug. Gibt es eine Möglichkeit, es so zu machen, dass es Duplikate entfernen auf die beiden?
Ich habe versucht, die änderung der for-each Durchlaufen jede Instanz von Aufzeichnungen, und haben versucht, erstellen Sie eine separate Vorlage für Sie, aber ich immer noch, scheint etwas zu fehlen, wie ich es noch nicht geschafft haben es zum laufen zu bringen.
Vielen Dank für jede Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, anstelle
preceding-sibling
mit nurpreceding
in Ihremxsl:if statement
.Ihnen hatte die richtige Idee, um Ihr Handwerk test, so dass Sie Strahlen nur einen
tr
einmal pro gestoßenDescription
Wert. Allerdingspreceding-sibling
hält die überprüfung zurück durch die unmittelbar untergeordneten Elemente des übergeordneten Elements;preceding
weiterhin die überprüfung früher in diesem Dokument, ist das, was Sie wollen zu vermeiden, die Vervielfältigung überRecords
.Zur info, es gibt auch ein Tippfehler, wo
Record(
sollteRecord[
. Hier ist eine komplette, operative Umsetzung, einschließlich dieser änderungen:Obwohl @kjhughes war in der Lage, die Frage zu beantworten, die Sie haben, für einen effizienteren Ansatz, den Sie verwenden möchten, werden die Muenchain Methode.
Zu tun, definieren Sie eine Taste, um Gruppe auf
Dann Gruppe diejenigen Elemente, die mit diesem Schlüssel
Und verwenden Sie dann die Taste, um zählen nur diejenigen, die bestimmte Elemente
Dieser Prozess sehr viel effizienter und erfordert keine Navigation in der gesamten Struktur zu jeder Zeit.
Insgesamt also, wenn man diese XML -
Anwenden von XSLT ist es
Es erzeugt diese Ausgabe