首先感谢所有在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/*
等)
答案 0 :(得分:0)
我认为应该是key('SubjectKey', subject)
,而不是key('SubjectKey', 'subject')
(请注意引号)并且谓词应该在$ResultSet
上,而不是$ResultSet/subject
:
$ResultSet[generate-id() = generate-id(key('SubjectKey', subject)[1])]
答案 1 :(得分:0)
您是否尝试过,因为密钥只需要知道它在xpath上匹配的节点,这似乎就是您正在做的事情。