2012-03-19 9 views
4
私は別のフィールド上の特定のフィールドと連結でフィルタしようとしています

XSLT、連結フィールド一緒

入力:

<?xml version="1.0" encoding="UTF-8"?> 
<payloads> 
    <payload> 
     <firstname>michael</firstname> 
     <secondname>brown</secondname> 
     <number>1</number> 
    </payload> 
    <payload> 
     <firstname>michael</firstname> 
     <secondname>brown</secondname> 
     <number>2</number> 
    </payload> 
    <payload> 
     <firstname>michael</firstname> 
     <secondname>brown</secondname> 
     <number>3</number> 
    </payload> 
</payloads> 

出力:私は私がする必要があることを知っている

<?xml version="1.0" encoding="UTF-8"?> 
<payloads> 
    <payload> 
     <firstname>michael</firstname> 
     <secondname>brown</secondname> 
     <number>1,2,3</number> 
    </payload> 
</payloads> 

各ペイロードタグをループしますが、現時点では正しく出力されません。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="payloads"> 
     <xsl:copy> 
      <xsl:for-each select="payload"> 
       <payload> 
        <xsl:value-of select="firstname"/> 
        <xsl:value-of select="secondname"/> 
        <xsl:value-of select="number"/> 
       </payload> 
      </xsl:for-each> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

を現時点では私はこれを持っていますグループを 'firstname'、' secondname'でグループ化し、それらのすべての数字を「集約」(連結)しますか? –

+0

はい、それは計画です! –

答えて

2

このテンプレートを使用:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:key name="k" match="payload" use="concat(firstname, '|', secondname)"/> 

    <xsl:template match="payload[generate-id() = 
        generate-id(key('k', concat(firstname, '|', secondname)))]"> 
     <xsl:copy> 
      <xsl:copy-of select="firstname"/> 
      <xsl:copy-of select="secondname"/> 
      <number> 
       <xsl:for-each select="key('k', concat(firstname, '|', secondname))"> 
        <xsl:value-of select="number"/> 

        <xsl:if test="position() != last()"> 
         <xsl:text>,</xsl:text> 
        </xsl:if> 
       </xsl:for-each> 
      </number> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="payload"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

提供された入力XMLに適用された場合、それは望んでいた正しい結果出力:だから実際には、あなたがしたい

<payloads> 
    <payload> 
    <firstname>michael</firstname> 
    <secondname>brown</secondname> 
    <number>1,2,3</number> 
    </payload> 
</payloads> 
+1

これは完全に機能します。ありがとうございました。もし私が同じものを使用したいと思うが、firstnameと言うだけでマッチすれば、これを使うことができますか? '' ??そして、 '&this' ' ?? –

+0

@liveek、ようこそ。はい、できます。 –

+0

それは素晴らしいです。私はこれに新しいものとしてXSLTでもっと多くのexperianceを得たいと思っていたIMに不思議に思っていました。あなたが読むアドバイスや、より充実するための訓練がありますか? –

関連する問題