2009-06-19 54 views
0
<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),我想打开并选择一些节点从,除非该节点的值等于值在所有前面的文档中都是同一个节点。XSLT 1.0:多个文档

为了得到这个工作,我必须嵌套两个for-each循环,因为我必须将当前文档名称保存在一个变量中以选择其前面的兄弟($current_filename/preceding-sibling)。

这一切都有效,但由于我有两个嵌套循环,我无法从所有文档中对结果节点进行排序,就好像它是一个大的序列。现在,如果我在第一个for-each中插入排序规则,那么它将对每个文档的节点进行排序。

有没有人知道一种方法来实现这种排序吗?也许有一种方法可以避免使用变量,从而避免每个循环的嵌套?

回答

0

我已经发现如何做到这一点!

通过首先选择所有节点并对它们进行排序,然后我就可以筛选出我不想要的节点!所以我改变了选择/排序的顺序。首先选择然后排序是不可能的,但反过来工作正常!感谢您的输入:)。

1

只有这样,才能做到这一点的一个步骤是将所有节点存储在一个变量并将其转换为与node-set()扩展功能设置节点的例子。然后可以对组合的节点集进行正常排序。

如果由于某种原因不能使用node-set()函数,则只能在两个单独的转换步骤中拆分操作:1)在临时文档中未排序的输出节点,2)将临时文档转换为所需输出。