XSL:组合分组和调用模板

时间:2009-08-18 17:00:57

标签: xslt key unique

我感兴趣地阅读了网上可用的技术,以便从包含使用XSL的重复项的XML文件中提取唯一的项目列表。

这些分为两类: 1)Muenchian方法(例如:http://www.jenitennison.com/xslt/grouping/) 2)或前一个兄弟的查找 这些都依赖于XPath表达式来选择要分组的数据。

但是,在我正在尝试解决的XML文件中,XML文件中的数据不是“本机”存在的。我正在使用xsl:template来计算我元素中的一些聚合数据。我想根据汇总数据进行分组。

例如我有:

<filmsreview>
    <record><data name='movie'>Star Wars</data><data name='ratings'>John:Good, Mary:Good</data></record>
    <record><data name='movie'>Indiana Jones</data><data name='ratings'>John:Good, Mary:Bad, Helen:Average</data></record>
    <record><data name='movie'>Titanic</data><data name='ratings'>John:Bad, Helen:Good</data></record>
</filmsreview>

我知道数据的结构化并不完美,通过创建子元素我可以更轻松地做一些事情,但我不能轻易地改变数据源,所以让我们把它作为一个挑战。

我想建立一个概述,我有约翰的独特评级: 约翰的评级: 好 坏

我有一个xsl:模板,可以获取记录元素并返回此记录的John评级: 例如:

<xsl:template name="get_rating">
   <xsl:param name="reviewer" />
     <!-- I use some string manipulation, and xsl:value-of to return the review for John-->
</xsl:template>

我可以在xsl:for-each下调用它来获取John的评论的详尽列表。但我无法将此调用与任何方法结合使用以获得唯一值。

我是否必须使用中间XSL将我的XML文件转换为更结构化的方式?或者我可以一步完成吗?

非常感谢 杰拉德

1 个答案:

答案 0 :(得分:1)

嗯......这应该可以使用xslt变量和nodeset方法,也许是这样的:

<xsl:variable name="_johnsRatings">
   <xsl:apply-templates select="/" mode="johnsRatings" />
</xsl:variable>
<xsl:variable name="johnsRatings" select="msxsl:node-set($_johnsRatings)" />

<xsl:template match="/" mode="johnsRatings">
    <Ratings>
         <xsl:for-each select="/filmsReview/record/data[@name='ratings']">
              <Rating><xsl:call-template name="get_rating" /></Rating>
         </xsl:for-each>
    </Ratings>
</xsl:template>

此时,应该可以使用标准XPath查询查询$ johnsRatings变量,并且您可以使用上面提到的两种方法之一从中检索唯一值......

希望有所帮助

编辑: 我不知道您使用的是什么XSLT引擎,我假设您可以访问msxsl:node-set()函数。但是,大多数XSLT处理器都有类似的方法,因此您可能需要在处理器中搜索等效方法

相关问题