【问题标题】:XSL unique value keyXSL 唯一值键
【发布时间】: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。请参阅我的答案以获取推荐的解决方案。
  • 性能应该根据一些在这种情况下不存在的参考来衡量。它比什么慢吗?它是否比不执行区分的样式表慢?

标签: xslt xslt-1.0


【解决方案1】:

我从给出的信息中看不出任何原因,为什么代码应该很慢。可能值得看看缓慢是所有 XSLT 处理器都发生的事情,还是某个处理器特有的。

【讨论】:

    【解决方案2】:

    尝试替换

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

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

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

    【讨论】:

    • 谢谢迪米特。我注意到在这个论坛的另一个帖子中,您使用了类似 key('SubjectKey', '.') ... 的点字符与使用确切名称“主题”相同吗?
    • @KyleM: 不,. 表示当前节点(在这种情况下以当前节点的字符串值作为键值),subject 表示所有名为@的子元素987654325@ -- 在这种情况下,任何subject 子项的字符串值都用作键值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    相关资源
    最近更新 更多