0

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

这些范围分为 2 类: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:template 可以接受一个记录元素并返回 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 文件转换为更结构化的方式?或者我可以一步完成吗?

非常感谢杰拉德

4

1 回答 1

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 处理器都有类似的方法,因此您可能需要在处理器中四处寻找等效的方法

于 2009-08-18T17:15:46.043 回答