【发布时间】:2011-03-16 13:46:46
【问题描述】:
目标
(XSLT 1.0)。我的目标是获取一组元素 S,并生成另一组 T,其中 T 包含 S 中的唯一元素。并且尽可能高效地这样做。 (注意:我不必创建包含集合的变量或类似的东西。我只需要遍历唯一的元素)。
示例输入和键
<!-- My actual input consists of a bunch of <Result> elements -->
<AllMyResults>
<Result>
<someElement>value</state>
<otherElement>value 2</state>
<subject>Get unique subjects!</state>
</Result>
</AllMyResults>
<xsl:key name="SubjectKey" match="AllMyResults/Result" use="subject"/>
我认为上述方法可行,但是当我使用我的密钥时,速度非常慢。下面是我如何使用我的密钥的代码。
<xsl:for-each select="Result[count(. | key('SubjectKey', subject)[1]) = 1]">
<xsl:sort select="subject" />
<!-- Do something with the unique subject value -->
<xsl:value-of select="subject" />
</xsl:for-each>
其他信息
我认为我做错了,因为它大大减慢了我的 XSL。作为一些附加信息,上面显示的代码位于与我的主 XSL 文件不同的 XSL 文件中。从主 XSL 中,我调用了一个包含上面所示的 xsl:key 和 for-each 的模板。此模板的输入是一个 xsl:param,其中包含我的节点集(类似于上面显示的示例输入)。
【问题讨论】:
-
好问题,+1。请参阅我的答案以获取推荐的解决方案。
-
性能应该根据一些在这种情况下不存在的参考来衡量。它比什么慢吗?它是否比不执行区分的样式表慢?