XSL唯一值键

时间:2011-03-16 13:46:46

标签: xslt xslt-1.0

目标

(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(类似于上面显示的示例输入)。

2 个答案:

答案 0 :(得分:1)

我无法从给出的信息中看出任何原因,为什么代码应该很慢。如果慢速是在所有XSLT处理器上发生的事情,或者它是否特殊,那么可能值得一看。

答案 1 :(得分:0)

尝试替换

count(. | key('SubjectKey', subject)[1]) = 1

<强>与

generate-id() = generate-id(key('SubjectKey', subject)[1])

在某些XSLT处理器中,后者要快得多。