XSL generate-key()的唯一元素

时间:2011-03-16 20:47:21

标签: xslt xslt-1.0

首先感谢所有在my previous thread回复的人。为了避免混淆,我在这里发布了类似的信息,但相应地更新了问题。

我的问题是我的xsl for-each如下所示永远不会被执行,表明结果集中没有任何内容。但是,我无法弄清楚为什么。以下进一步说明。

输入结构

<AllMyResults>
<Result>
<someElement>value</state>
<otherElement>value 2</state>
<subject>Get unique subjects!</state>
</Result>
</AllMyResults>

在我的XSL文件的顶部,我有关键语句

<xsl:key name="SubjectKey" match="All_Results/Result" use="subject"/>

[2] 我的XSL文件的内容,它使用不同的输入结构:

<xsl:for-each select="$ResultSet/subject[
                         generate-id()
                          = generate-id(key('SubjectKey', 'subject')[1])
                      ]">
... this point is never reached ...
</xsl:for-each>

上面[2]使用的输入结构 输入结构只是一个元素列表。

我在这里缺少什么?我使用调试器来确定for-each从未执行过,这表明表达式$ResultSet/subject[generate-id() = generate-id(key('SubjectKey', 'subject')[1])]生成的集合是空集。但为什么?

其他信息

$ ResultSet是一个节点集。这是传递给模板的参数。根据我的调试器,“key”语句会被执行相应的次数 - 每次在我的输入文件中显示“subject”。根据我所读到的有关generate-id()的内容,没有参数,它在当前节点上运行。而不是$ResultSet/subject我也尝试了各种各样的变化。 ($ResultSet/*/subject$ResultSet/*等)

2 个答案:

答案 0 :(得分:0)

我认为应该是key('SubjectKey', subject),而不是key('SubjectKey', 'subject')(请注意引号)并且谓词应该在$ResultSet上,而不是$ResultSet/subject

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

答案 1 :(得分:0)

您是否尝试过,因为密钥只需要知道它在xpath上匹配的节点,这似乎就是您正在做的事情。