2016-08-19 2 views
0

xsl 변환을 처음 사용하고 하위 문자열을 그룹화하는 데 어려움이 있습니다.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이

<?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 그룹에이 태그 있지만 ' 다시 어쨌든. –

+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>