我感兴趣地阅读了网上可用的技术,以便从包含使用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文件转换为更结构化的方式?或者我可以一步完成吗?
非常感谢 杰拉德
答案 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处理器都有类似的方法,因此您可能需要在处理器中搜索等效方法