2016-08-19 7 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> 
関連する問題