转型与转型使用XSLT进行分组

时间:2013-06-11 13:08:08

标签: xml xslt transform

我正在尝试转换某些XML,但我不确定它是否可行。

  1. 这甚至可以实现吗?
  2. 我如何更新翻译以完成翻译?
  3. 我想在学年之前对这些实例进行分组,并将每个实例内容的其余部分输出到每个实例的列/行的表中。年份将成为标题,其余内容将显示在表格中。如果还有一些2014年的情况,那将是一个新标题和新表。

    <courses>
      <course>
      <uuid>123</uuid>
                <coursetitle>Being better at XSLT</coursetitle>
                <coursetypes>
                  <coursetype>Postgraduate</coursetype>
                </coursetypes>
       <instances> 
            <instance> 
                  <uuid>1054EDE3F28D9873</uuid> 
                  <instancecode>MPW1F</instancecode> 
                  <year>2013</year> 
              </instance> 
    
              <instance> 
                  <uuid>D9FC4501-F504-B560-FB8DFC3EF41C0E1F</uuid> 
                  <instancecode>MPO1F</instancecode> 
                  <year>2013</year> 
               </instance> 
    
              <instance> 
                  <uuid>D9FC5017-0789-16A0-C8BBD0F0BE016E6F</uuid> 
                  <instancecode>MPW2F</instancecode> 
                  <year>2013</year> 
              </instance> 
    
              <instance> 
                  <uuid>D9FC4963-A684-565A-5AA282A7CEC7B4CC</uuid> 
                  <instancecode>MPO2F</instancecode> 
                  <year>2013</year> 
              </instance> 
        </instances> 
      </course>
        <course>
      <uuid>1234</uuid>
                <coursetitle>Being better at XML</coursetitle>
                <coursetypes>
                  <coursetype>Postgraduate</coursetype>
                </coursetypes>
       <instances> 
            <instance> 
                  <uuid>1054EDE3F28D9873</uuid> 
                  <instancecode>MPW1F</instancecode> 
                  <year>2014</year> 
              </instance> 
    
              <instance> 
                  <uuid>D9FC4501-F504-B560-FB8DFC3EF41C0E1F</uuid> 
                  <instancecode>MPO1F</instancecode> 
                  <year>2014</year> 
               </instance> 
    
              <instance> 
                  <uuid>D9FC5017-0789-16A0-C8BBD0F0BE016E6F</uuid> 
                  <instancecode>MPW2F</instancecode> 
                  <year>2013</year> 
              </instance> 
    
              <instance> 
                  <uuid>D9FC4963-A684-565A-5AA282A7CEC7B4CC</uuid> 
                  <instancecode>MPO2F</instancecode> 
                  <year>2013</year> 
              </instance> 
        </instances> 
      </course>
    </courses>
    

    我查看了XSLT 1.0 - Create a Unique, Ordered List,但它似乎只对相对于根目录进行分组。

    这是我们试图运行的转换*并且它似乎适用于2013年的第一次出现但是下一个课程实例被忽略(假设因为它已经找到了那一年的实例)。

    **请注意,为了更清洁,我从上面的代码中删除了一些打印的内容*

    <!-- Instances -->
        <xsl:template match="instances">
            <xsl:for-each select="./instance[applicationmethod != 'NO_APP' and applicationmethod != '' and generate-id()= generate-id(key('acyear',year)[1])]">
                <xsl:sort select="year" />
                <xsl:value-of select="./year"/>,
            </xsl:for-each>
            <xsl:apply-templates select="./instance">
                <xsl:sort select="year"/>
            </xsl:apply-templates>
        </xsl:template>
        <xsl:template match="instance">
            <xsl:if test="./applicationmethod != 'NO_APP' and ./applicationmethod != ''">
            &lt;li&gt;
                <xsl:text>&lt;strong&gt;UUID:&lt;/strong&gt;</xsl:text><xsl:value-of select="./uuid"/>
                <xsl:text>, &lt;strong&gt;Instance Code:&lt;/strong&gt;</xsl:text><xsl:value-of select="./instancecode"/>
                <xsl:text>, &lt;strong&gt;Year:&lt;/strong&gt;</xsl:text><xsl:value-of select="./academicyear"/>
                <xsl:text>, &lt;strong&gt;Course Year:&lt;/strong&gt;</xsl:text><xsl:value-of select="./courseyear"/>
                <xsl:text>, &lt;strong&gt;Start Date:&lt;/strong&gt;</xsl:text><xsl:value-of select="./startdate"/>
                <xsl:text>, &lt;strong&gt;End Date:&lt;/strong&gt;</xsl:text><xsl:value-of select="./enddate"/>
                <xsl:text>, &lt;strong&gt;Display From:&lt;/strong&gt;</xsl:text><xsl:value-of select="./displayfrom"/>
                <xsl:text>, &lt;strong&gt;Display To:&lt;/strong&gt;</xsl:text><xsl:value-of select="./displayto"/>
                <xsl:text>, &lt;strong&gt;Mode of Study:&lt;/strong&gt;</xsl:text><xsl:value-of select="./modeofstudy"/>
                <xsl:text>, &lt;strong&gt;Application Method:&lt;/strong&gt;</xsl:text><xsl:value-of select="./applicationmethod"/>
                <xsl:text>, &lt;strong&gt;Apply Link:&lt;/strong&gt;</xsl:text><xsl:value-of select="./applylink"/>
                <xsl:text>, &lt;strong&gt;Cost:&lt;/strong&gt;</xsl:text><xsl:value-of select="./cost"/>
                <xsl:text>, &lt;strong&gt;Day and Time:&lt;/strong&gt;</xsl:text><xsl:value-of select="./dayandtime"/>
            &lt;/li&gt;
            </xsl:if>
        </xsl:template>
    

    输出

    每个课程都是不同的页面,但内容看起来像

    更擅长XSLT
    研究生

    2013

    • MPW1F
    • MPO1F
    • MPW2F
    • MPO2F

    更擅长XML
    研究生

    2014

    • MPW1F
    • MPO1F

    2013

    • MPW2F
    • MPO2F

1 个答案:

答案 0 :(得分:1)

听起来你必须按年份对属于一门课程的实例进行分组。 这可以使用如下的密钥完成:

<xsl:key name="kCourseInstaneByYears" match="instance" use="concat(ancestor::course/uuid, '|' , year)"/>

这假设课程/ uuid对于课程是唯一的。

使用这个键你可以尝试这样的事情(乖乖不完整,但应该表明这个想法)。

?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="kCourseInstaneByYears" match="instance" use="concat(ancestor::course/uuid, '|' , year)"/>

    <xsl:template match="/*">
        <html>
            <body>
                <xsl:apply-templates select="//course" />
            </body>
        </html>
    </xsl:template>

    <xsl:template match="course">
        <xsl:variable name ="courseID" select="uuid" />
        <h1>
            <xsl:value-of select="coursetitle"  />
        </h1>
        <xsl:for-each select="descendant::instance[generate-id() = 
                                    generate-id(key('kCourseInstaneByYears', concat($courseID, '|' , year))[1])]"  >
            <xsl:sort select="year"/>

            <xsl:variable name="year" select="year" />
            <h2>
                <xsl:value-of select="$year"/>
            </h2>
            <table>
                <xsl:apply-templates select="key('kCourseInstaneByYears', concat($courseID, '|' , $year))" />


            </table>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="instance" >
        <tr>
            <td>
                <xsl:value-of select="uuid"/>
            </td>
            <td>
                <xsl:value-of select="instancecode"/>
            </td>
        </tr>
    </xsl:template>

</xsl:stylesheet>

将生成以下输出:

<html>
  <body>
    <h1>Being better at XSLT</h1>
    <h2>2013</h2>
    <table>
      <tr>
        <td>1054EDE3F28D9873</td>
        <td>MPW1F</td>
      </tr>
      <tr>
        <td>D9FC4501-F504-B560-FB8DFC3EF41C0E1F</td>
        <td>MPO1F</td>
      </tr>
      <tr>
        <td>D9FC5017-0789-16A0-C8BBD0F0BE016E6F</td>
        <td>MPW2F</td>
      </tr>
      <tr>
        <td>D9FC4963-A684-565A-5AA282A7CEC7B4CC</td>
        <td>MPO2F</td>
      </tr>
    </table>
    <h1>Being better at XML</h1>
    <h2>2013</h2>
    <table>
      <tr>
        <td>D9FC5017-0789-16A0-C8BBD0F0BE016E6F</td>
        <td>MPW2F</td>
      </tr>
      <tr>
        <td>D9FC4963-A684-565A-5AA282A7CEC7B4CC</td>
        <td>MPO2F</td>
      </tr>
    </table>
    <h2>2014</h2>
    <table>
      <tr>
        <td>1054EDE3F28D9873</td>
        <td>MPW1F</td>
      </tr>
      <tr>
        <td>D9FC4501-F504-B560-FB8DFC3EF41C0E1F</td>
        <td>MPO1F</td>
      </tr>
    </table>
  </body>
</html>