我正在尝试转换某些XML,但我不确定它是否可行。
我想在学年之前对这些实例进行分组,并将每个实例内容的其余部分输出到每个实例的列/行的表中。年份将成为标题,其余内容将显示在表格中。如果还有一些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 != ''">
<li>
<xsl:text><strong>UUID:</strong></xsl:text><xsl:value-of select="./uuid"/>
<xsl:text>, <strong>Instance Code:</strong></xsl:text><xsl:value-of select="./instancecode"/>
<xsl:text>, <strong>Year:</strong></xsl:text><xsl:value-of select="./academicyear"/>
<xsl:text>, <strong>Course Year:</strong></xsl:text><xsl:value-of select="./courseyear"/>
<xsl:text>, <strong>Start Date:</strong></xsl:text><xsl:value-of select="./startdate"/>
<xsl:text>, <strong>End Date:</strong></xsl:text><xsl:value-of select="./enddate"/>
<xsl:text>, <strong>Display From:</strong></xsl:text><xsl:value-of select="./displayfrom"/>
<xsl:text>, <strong>Display To:</strong></xsl:text><xsl:value-of select="./displayto"/>
<xsl:text>, <strong>Mode of Study:</strong></xsl:text><xsl:value-of select="./modeofstudy"/>
<xsl:text>, <strong>Application Method:</strong></xsl:text><xsl:value-of select="./applicationmethod"/>
<xsl:text>, <strong>Apply Link:</strong></xsl:text><xsl:value-of select="./applylink"/>
<xsl:text>, <strong>Cost:</strong></xsl:text><xsl:value-of select="./cost"/>
<xsl:text>, <strong>Day and Time:</strong></xsl:text><xsl:value-of select="./dayandtime"/>
</li>
</xsl:if>
</xsl:template>
每个课程都是不同的页面,但内容看起来像
更擅长XSLT
研究生
2013
更擅长XML
研究生
2014
2013
答案 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>