Xslt 变量中的XSL存储节点集

Xslt 变量中的XSL存储节点集,xslt,Xslt,(XSLT1.0。) 给定一个名为Rows的变量,该变量包含以下内容(示例): 输入 <AllResults> <Result> <subject>can be filtered by filter 1</subject> <type>can be filtered by filter 2</type> <date>can be filtered by filter 3

(XSLT1.0。) 给定一个名为Rows的变量,该变量包含以下内容(示例):

输入

<AllResults>
    <Result>
      <subject>can be filtered by filter 1</subject>
      <type>can be filtered by filter 2</type>
      <date>can be filtered by filter 3</date>
    </Result>
    <Result> ...
    </Result>
</AllResults>

可通过过滤器1进行过滤
可通过过滤器2进行过滤
可通过过滤器3进行过滤
...
我有3个过滤器变量。对于每个过滤器,如果过滤器变量不是空的,我希望将过滤器应用于上面显示的输入。我想将过滤结果(与过滤器匹配的项)存储到一个新变量中。我尝试了以下操作,但收到一条错误消息(filterResult),它是“结果树而不是节点集”。Rows变量是一个节点集,这是我通过使用调试器确定的

XSL的一部分

<xsl:variable name="filterResult">
    <xsl:choose>
        <xsl:when test="$filter1 != '' and $filter2 != '' and $filter3 != ''">
            <xsl:copy-of select="$Rows[date=$filter1 and type=$filter2 and subject=$filter3]" />
        </xsl:when>
        <xsl:when test="$filter1 != '' and $filter2 != ''">
            <xsl:copy-of select="$Rows[date=$filter1 and type=$filter2]" />
        </xsl:when>
        <xsl:when test="$filter1 != '' and $filter3 != ''">
            <xsl:copy-of select="$Rows[date=$filter1 and subject=$filter3]" />
        </xsl:when>
        <xsl:when test="$filter3 != '' and $filter2 != ''">
            <xsl:copy-of select="$Rows[type=$filter2 and subject=$filter3]" />
        </xsl:when>
        <xsl:when test="$filter1 != ''">
            <xsl:copy-of select="$Rows[date=$filter1]" />
        </xsl:when>
        <xsl:when test="$filter3 != ''">
            <xsl:copy-of select="$Rows[subject=$filter3]" />
        </xsl:when>
        <xsl:when test="$filter2 != ''">
            <xsl:copy-of select="$Rows[type=$filter2]" />
        </xsl:when>
        <xsl:otherwise> 
            <xsl:copy-of select="$Rows" />
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

我意识到的副本生成的是一个结果树,而不是一个节点集,但鉴于我上面描述的3个过滤器的要求,我不确定如何生成一个节点集

其他信息


我知道我可以做一些类似
的事情,创建一个包含节点集的变量,但我不知道这对我有什么帮助,因为我有很多可能的条件(给定三个过滤器)

看起来,
$Rows
变量是Result Tree Fragment类型的实例

除了字符串操作之外,您不能在RTF上执行任何操作(如
[]
过滤器表达式提供的操作):从

允许对结果执行操作 仅当该操作 将允许在字符串( 对字符串的操作可能涉及 首先将字符串转换为 数字或布尔值)。特别是 不允许使用
/
/
, 和结果树上的
[]
运算符 碎片

此外,如果
$Rows
是如下节点集数据类型的实例,则所有显示的代码都可以简化:

<xsl:variable name="filterResult" 
              select="$Rows[(date=$filter1 or $filter1='')
                               and 
                            (type=$filter2 or $filter2='')
                               and 
                            (subject=$filter3 or $filter3='')]"/>


有一些XSLT处理器(主要是每一个)为RTF到节点集的转换提供扩展函数的实现。

在XSLT 1.0中,从源文档创建包含一组节点的变量的唯一方法是在
select
属性中计算XPath表达式:

<xsl:variable name="name" select="xpath_expression"/>

但您甚至不需要这样做:正如Alejandro所指出的,只需编写一个XPath表达式,就可以得到所需的结果。有些应用程序的节点选择非常复杂,您必须使用
node-set()
函数,但您的函数不是其中之一。

“看起来$Rows变量是类型Result Tree Fragment的实例。”它不是。。我已经使用调试器验证了它是一个节点集。“filterResult”最终是一个结果树片段,我希望它是一个节点集。@KyleM:您没有显示
$Rows
声明,也没有显示
$filterResult
用法。我们无法猜测。顺便说一句,这是XSLT1.0,根据我所读的内容,它无法将结果树片段作为节点集进行处理。Alejandro-非常感谢。对不起,我的问题不够详细,我只是想简明扼要。我相应地更新了它。
<xsl:variable name="filterResultNodeSet" select="msxsl:node-set($filterResult)"/>