2012-03-25 76 views
1

我有一個XML,顯示有看起來像字段值與字段值:XSLT把XML轉換與具有相同標籤的分組值

<data> 
    <currentRow> 
     <columnValue>usa</columnValue> 
     <columnValue>ma</columnValue> 
     <columnValue>boston</columnValue> 
     <columnValue>bob</columnValue> 
    </currentRow> 
    <currentRow> 
     <columnValue>usa</columnValue> 
     <columnValue>ma</columnValue> 
     <columnValue>boston</columnValue> 
     <columnValue>george</columnValue> 
    </currentRow> 
    <currentRow> 
     <columnValue>usa</columnValue> 
     <columnValue>ny</columnValue> 
     <columnValue>nyc</columnValue> 
     <columnValue>mary</columnValue> 
    </currentRow> 
    </data> 

我要生成生產,看起來像一個Xml

<Class> 
    <Student> 
    <Country>usa</Country> 
    <State>ma</State> 
    <City>boston</City> 
     <name>bob</name> 
     <name>george</name> 
    </Student> 
    <Student> 
    <Country>usa</Country> 
    <State>ny</State> 
    <City>nyc</City> 
     <name>mary</name> 
    </Student> 
<Class> 

總之,我有兩個問題:

  1. 我想遍歷當前行生成一個通用的XML
  2. 我想組在他們所居住的位置,學生姓名,首先在城市上空,然後狀態,然後國家

任何想法,我該怎麼做呢?

+0

您的輸出XML無效。 ' boston '? 「 ......」的縮進是否表明它應該在''元素內?請修正輸出XML以顯示您真正想要完成的內容。 – 2012-03-25 23:02:43

回答

1

以下樣式表使用使用第一3個columnValue元素的值的Muenchian Method到組currentRow元件。

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

    <!--Create a key grouping on the concatenated values of 
     country, state, and city separated by '-'--> 
    <xsl:key name="students-by-country-state-city" 
      match="currentRow" 
      use="concat(columnValue[1], 
         '-', 
         columnValue[2], 
         '-', 
         columnValue[3])"/> 

    <xsl:template match="data"> 
     <Class> 
      <!--apply templates to the first item in each grouping of items --> 
      <xsl:apply-templates 
       select="currentRow[generate-id() = 
            generate-id(
            key('students-by-country-state-city', 
             concat(columnValue[1], 
             '-', 
             columnValue[2], 
             '-', 
             columnValue[3]))[1] 
            )]" 
      /> 
     </Class> 
    </xsl:template> 

    <xsl:template match="currentRow"> 
     <Student> 
      <Country> 
       <xsl:value-of select="columnValue[1]"/> 
      </Country> 
      <State> 
       <xsl:value-of select="columnValue[2]"/> 
      </State> 
      <City> 
       <xsl:value-of select="columnValue[3]"/> 
      </City> 

      <!-- find all of the names for this grouping --> 
      <xsl:for-each 
       select="key('students-by-country-state-city', 
            concat(columnValue[1], 
              '-', 
              columnValue[2], 
              '-', 
              columnValue[3]))/columnValue[4]"> 
       <name> 
        <xsl:value-of select="."/> 
       </name> 
      </xsl:for-each> 
     </Student> 
    </xsl:template> 

</xsl:stylesheet>