2016-08-19 7 views
0

Я новичок в xsl-преобразованиях и проблема с группировкой подстрок. У меня есть XML, как в следующем:Группировка подстрок с 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> 

и этот 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> 

И это заставляет меня это:

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

Но то, что я хотел бы это:

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

Как его изменить?

+0

Ну, помеченный это с Muenchian группировкой, но вы re n не делать. –

+0

Я видел, как он упоминал о группировке и не понимал этого, но думал, что это может быть актуально здесь. Я не уверен, как совместить результаты подстроки с группировкой, чтобы получить нужный мне результат. – Oleg

+0

Это очень актуально здесь. См. Http://www.jenitennison.com/xslt/grouping/muenchian.html –

ответ

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> 

Выход:

<?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> 
Смежные вопросы