XSLT转换XML,并使用相同的标记对值进行分组

时间:2012-03-25 20:49:48

标签: xml xslt xslt-1.0

我有一个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. 我想遍历Current Rows以生成通用XMl
  2. 我想将学生姓名分组到他们居住的地方,首先是城市,然后是州和国家
  3. 任何想法我该怎么做?

1 个答案:

答案 0 :(得分:1)

以下样式表使用 Muenchian Method 使用前3个currentRow元素的值对columnValue元素进行分组。

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