2016-08-19 3 views
0

Ich bin neu bei xsl transformers und habe Schwierigkeiten beim Gruppieren von Teilstrings. Ich habe einige XML wie folgt aus:Gruppierung von Teilstrings mit XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<document-root> 
    <classes> 
    <class1>CATSryverty</class1> 
    <class1>CATSt6vvy</class1> 
    <class1>CATS4yv6v</class1> 
    <class1>DOGSrybytb</class1> 
    <class1>DOGSbu6b</class1> 
    <class1>DOGS5u57756</class1> 
    </classes> 
</document-root> 

und dieses xsl:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <docs> 
     <xsl:for-each select="document-root/classes"> 
      <xsl:element name="classesCSV"> 
       <xsl:for-each select="class1/text()"> 
        <xsl:value-of select="substring(., 1, 4)"/> 
        <xsl:if test="not(position() = last())">,</xsl:if> 
       </xsl:for-each> 
      </xsl:element> 
     </xsl:for-each> 
    </docs> 
</xsl:template> 
</xsl:stylesheet> 

Und das bringt mich dieses:

<?xml version="1.0" encoding="UTF-8"?> 
<docs> 
<classesCSV>CATS,CATS,CATS,DOGS,DOGS,DOGS</classesCSV> 
</docs> 

Aber was ich möchte, ist dies:

<?xml version="1.0" encoding="UTF-8"?> 
<docs> 
<classesCSV>CATS,DOGS</classesCSV> 
</docs> 

Wie sollte ich es ändern?

+0

Nun hat Sie diese mit Muench-Gruppierung, aber Sie‘ re n nichts tun. –

+0

Ich habe es in Bezug auf Gruppierung erwähnt und verstehe es nicht, aber dachte, dass es hier relevant sein könnte. Ich bin mir nicht sicher, wie ich die Ergebnisse von Teilstrings zu Gruppierungen kombinieren soll, um das Ergebnis zu erhalten, das ich brauche. – Oleg

+0

Es ist sehr relevant hier. Siehe: http://www.jenitennison.com/xslt/grouping/muenchian.html –

Antwort

1

XSLT 1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:key name="kDistinct" match="class1" use="substring(., 1,4)"/> 
<xsl:template match="/"> 
<docs> 
    <xsl:for-each select="document-root/classes"> 
     <xsl:element name="classesCSV"> 
      <xsl:for-each select="class1[generate-id() = 
          generate-id(key('kDistinct', substring(.,1,4))[1])]"> 
      <xsl:value-of select="substring(.,1,4)"/> 
      <xsl:if test="not(position() = last())">,</xsl:if> 
      </xsl:for-each> 
     </xsl:element> 
    </xsl:for-each> 
</docs> 
</xsl:template> 
</xsl:stylesheet> 

Ausgang:

<?xml version="1.0" encoding="UTF-8"?> 
<docs> 
    <classesCSV>CATS,DOGS</classesCSV> 
</docs> 

XSLT 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
    <docs> 
    <xsl:element name="classesCSV"> 
     <xsl:for-each-group select="//class1" group-by="substring(., 1,4)"> 
     <xsl:value-of select="current-grouping-key()"/> 
     <xsl:if test="not(position() = last())">,</xsl:if> 
     </xsl:for-each-group> 
    </xsl:element> 
    </docs> 
</xsl:template> 
</xsl:stylesheet>