目标
(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(类似于上面显示的示例输入)。
答案 0 :(得分:1)
我无法从给出的信息中看出任何原因,为什么代码应该很慢。如果慢速是在所有XSLT处理器上发生的事情,或者它是否特殊,那么可能值得一看。
答案 1 :(得分:0)
尝试替换
count(. | key('SubjectKey', subject)[1]) = 1
<强>与强>:
generate-id() = generate-id(key('SubjectKey', subject)[1])
在某些XSLT处理器中,后者要快得多。