<xsl:for-each select="//filenames">
<xsl:variable name="current_filename" select="."/>
<xsl:for-each select="
document(.)//someNode[not(
. = document($current_filename/preceding-sibling::node())//someNode
)]
">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
在上面的代码(XSLT 1.0)中,我有一系列文档(//filenames
),我想打开它并从中选择一些节点,除非该节点的值等于所有节点的值前面的文件。
为了实现这一点,我必须为每个循环嵌套两个,因为我必须将当前文档名称保存在变量中,以便选择其前一个兄弟($current_filename/preceding-sibling
)。
这一切都有效,但由于我有两个嵌套循环,我无法从所有文档中对结果节点进行排序,就像它是一个大序列一样。如果我将排序规则插入到第一个for-each中,它现在会对每个文档的节点进行排序。
有没有人知道如何实现这种排序?也许是一种避免必须使用变量并因此嵌套for-each循环的方法?
答案 0 :(得分:1)
在一个步骤中执行此操作的唯一方法是将所有节点存储在变量中,并将其转换为具有node-set()
扩展函数的节点集。然后可以正常对组合的节点集进行排序。
如果由于某种原因无法使用node-set()
函数,则只能在两个单独的转换步骤中分解操作:1)在临时文档中未排序的输出节点,2)将temp文档转换为所需的输出
答案 1 :(得分:0)
你可以将整个结果放在一个变量中 - 然后使用node-set然后你可以求结果。请参阅此处了解使用node-set http://www.exslt.org/exsl/functions/node-set/index.html
的示例约什
答案 2 :(得分:0)
我发现了如何做到这一点!
首先只选择所有节点并对它们进行排序,然后我就能过滤掉我不想要的节点!所以我改变了选择/排序的顺序。首先选择然后排序是不可能的,但反过来工作正常!感谢您的意见:)。