Xslt 唯一值键

Xslt 唯一值键,xslt,xslt-1.0,Xslt,Xslt 1.0,目标 (XSLT1.0)。我的目标是获取一组元素S,并生成另一组元素T,其中T包含S中唯一的元素,并尽可能高效地这样做。(注意:我不需要创建一个包含集合的变量,或者类似的东西。我只需要在唯一的元素上循环) 输入和按键示例 <!-- My actual input consists of a bunch of <Result> elements --> <AllMyResults> <Result> <someElement>value&

目标

(XSLT1.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"/>

价值
价值2
获得独特的主题!
我认为上面的方法是有效的,但是当我使用我的钥匙时,速度非常慢。下面是我如何使用钥匙的代码

<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的模板,如上图所示。此模板的输入是一个包含我的节点集的xsl:param(类似于上面显示的示例输入)。

尝试替换

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

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

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

尝试替换

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

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

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

从给出的信息中,我看不出代码速度慢的原因。是否所有XSLT处理器都会出现这种速度慢,或者这种速度慢是某个XSLT处理器所特有的,也许值得一看。

从给出的信息中,我看不出代码速度慢的原因。如果所有XSLT处理器上都会出现这种慢度,或者是某个处理器特有的慢度,那么可能值得一看。

好问题,+1。关于推荐的解决方案,请参阅我的答案。性能应根据本例中缺少的一些参考来衡量。比什么慢?它是否比不执行区分的样式表慢?好问题,+1。关于推荐的解决方案,请参阅我的答案。性能应根据本例中缺少的一些参考来衡量。比什么慢?它比一个没有进行区分的样式表慢吗?谢谢Dimitre。我注意到在这个论坛的另一个帖子中,你使用了类似key('SubjectKey','.')的东西。。。使用点字符是否与使用确切名称“subject”相同?@KyleM:No,
表示当前节点(在本例中,当前节点的字符串值用作键值),
subject
表示名为
subject
的所有子元素,在本例中,任何
subject
子元素的字符串值都用作键值。谢谢Dimitre。我注意到在这个论坛的另一个帖子中,你使用了类似key('SubjectKey','.')的东西。。。使用点字符是否与使用确切名称“subject”相同?@KyleM:No,
表示当前节点(在本例中,当前节点的字符串值用作键值),
subject
表示名为
subject
的所有子元素,在这种情况下,任何
subject
子元素的字符串值都用作键值。