2011-01-09 8 views
2

入力xmlに対する応答を得るためにxsltを書きます。前もって感謝します。従業員の詳細ごとに月の年の組み合わせが繰り返されないように出力をグループ化したい。月と年の組み合わせによるグループ応答

入力XML:

<resultset> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>2</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Anu</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>24</value> 
     </column> 
    </row> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>2</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Nancy</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>26</value> 
     </column> 
    </row> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>3</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Ned</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>25</value> 
     </column> 
    </row> 
</resultset> 

期待出力:

<Response> 
    <PeriodInfo> 
     <Month>2</Month> 
     <Year>2010</Year> 
     <EmployeeDetails> 
      <Name>Anu</Name> 
      <Age>24</Age> 
     </EmployeeDetails> 
     <EmployeeDetails> 
      <Name>Nancy</Name> 
      <Age>26</Age> 
     </EmployeeDetails> 
    </PeriodInfo> 
    <PeriodInfo> 
     <Month>3</Month> 
     <Year>2010</Year> 
     <EmployeeDetails> 
      <Name>Ned</Name> 
      <Age>25</Age> 
     </EmployeeDetails> 
    </PeriodInfo> 
</Response> 

答えて

2

年と月でどのインデックス行、キー "行ごとの月" を定義します。

次に、Muenchianグループを使用して入力内の一意の年月の組み合わせを選択します。 「行」テンプレートは、これらのそれぞれに対して1回適用されます。

"EmployeeDetails"出力を生成するには、key()を使用して、現在のサマリー行と同じ年月のすべての行を選択します。ここで

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="row-by-month" match="row" 
      use="concat(column[name='Year']/value,'-', 
         column[name='Month']/value)" /> 

    <xsl:template match="resultset"> 
     <Response> 
      <xsl:apply-templates 
       select="row[generate-id(.) = 
          generate-id(key('row-by-month', 
              concat(column 
                 [name='Year'] 
                 /value, 
                '-', 
                column 
                 [name='Month'] 
                 /value))[1])]"/> 
     </Response> 
    </xsl:template> 

    <xsl:template match="row"> 
     <PeriodInfo> 
      <Year> 
       <xsl:value-of select="column[name='Year']/value"/> 
      </Year> 
      <Month> 
       <xsl:value-of select="column[name='Month']/value"/> 
      </Month> 
      <xsl:apply-templates select="key('row-by-month', 
              concat(column 
                 [name='Year'] 
                 /value, 
                '-', 
                column 
                 [name='Month'] 
                 /value))" 
           mode="details"/> 
     </PeriodInfo> 
    </xsl:template> 

    <xsl:template match="row" mode="details"> 
     <EmployeeeDetails> 
      <Name> 
       <xsl:value-of select="column[name='EmpName']/value"/> 
      </Name> 
      <Age> 
       <xsl:value-of select="column[name='Age']/value"/> 
      </Age> 
     </EmployeeeDetails> 
    </xsl:template> 


</xsl:stylesheet> 
+0

+1良い答え。 –

+0

不思議の国のように動作する答えを提供してくれてありがとうLachlan – alisha

+0

@alisha、この答えのtopleftのチェックマークをクリックしてLachlanの答えを受け入れるべきです。 – Flack

0

@ラクラン・ロシュのソリューションの本質的より読み変種である。この変換が提供されるXML文書に適用されるとき

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kRowByDate" match="row" 
    use="concat(column[name='Year']/value, 
      '+', 
      column[name='Month']/value)"/> 

<xsl:template match="/*"> 
    <Response> 
    <xsl:apply-templates/> 
    </Response> 
</xsl:template> 

<xsl:template match= 
    "row[generate-id() 
     = 
     generate-id(key('kRowByDate', 
         concat(column[name='Year']/value, 
           '+', 
           column[name='Month']/value) 
         )[1] 
        ) 
     ] 
    "> 
    <xsl:variable name="vMonth" select="column[name='Month']/value"/> 
    <xsl:variable name="vYear" select="column[name='Year']/value"/> 
    <PeriodInfo> 
    <Month><xsl:value-of select="$vMonth"/></Month> 
    <Year><xsl:value-of select="$vYear"/></Year> 
    <xsl:apply-templates mode="data" 
     select="key('kRowByDate', concat($vYear,'+',$vMonth))"/> 
    </PeriodInfo> 
</xsl:template> 

<xsl:template match="row"/> 

<xsl:template match="row" mode="data"> 
    <EmployeeDetails> 
    <Name><xsl:value-of select="column[name='EmpName']/value"/></Name> 
    <Age><xsl:value-of select="column[name='Age']/value"/></Age> 
    </EmployeeDetails> 
</xsl:template> 
</xsl:stylesheet> 

<resultset> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>2</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Anu</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>24</value> 
     </column> 
    </row> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>2</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Nancy</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>26</value> 
     </column> 
    </row> 
    <row> 
     <column> 
      <name>Month</name> 
      <value>3</value> 
     </column> 
     <column> 
      <name>Year</name> 
      <value>2010</value> 
     </column> 
     <column> 
      <name>EmpName</name> 
      <value>Ned</value> 
     </column> 
     <column> 
      <name>Age</name> 
      <value>25</value> 
     </column> 
    </row> 
</resultset> 

希望の正しい結果が得られます

<Response> 
    <PeriodInfo> 
     <Month>2</Month> 
     <Year>2010</Year> 
     <EmployeeDetails> 
     <Name>Anu</Name> 
     <Age>24</Age> 
     </EmployeeDetails> 
     <EmployeeDetails> 
     <Name>Nancy</Name> 
     <Age>26</Age> 
     </EmployeeDetails> 
    </PeriodInfo> 
    <PeriodInfo> 
     <Month>3</Month> 
     <Year>2010</Year> 
     <EmployeeDetails> 
     <Name>Ned</Name> 
     <Age>25</Age> 
     </EmployeeDetails> 
    </PeriodInfo> 
</Response> 
関連する問題