(XSLT 1.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>
Run Code Online (Sandbox Code Playgroud)
我有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>
Run Code Online (Sandbox Code Playgroud)
我意识到copy-of产生了一个结果树,而不是一个节点集,但我不确定如何根据我上面描述的3个过滤器要求生成一个节点集.
附加信息
我知道我可以做一些类似于<xsl:variable name="me" select="/set/node"/>
创建包含节点集的变量的东西,但我不知道这对我有什么帮助,因为我有很多可能的条件(给定三个过滤器).
Rob*_*ney 11
在XSLT 1.0中,创建包含源文档中的一组节点的变量的唯一方法是通过评估select
属性中的XPath表达式:
<xsl:variable name="name" select="xpath_expression"/>
Run Code Online (Sandbox Code Playgroud)
不能使用copy-of
,apply-templates
或call-template
; 这些都将产生结果树片段.
我所知道的每个XSLT处理器都实现了一个扩展函数,可以将结果树片段转换为节点集,因此,除非您需要将转换完全跨平台,否则可以执行以下操作(此示例使用Microsoft的XSLT处理器):
<xsl:variable name="filterResultNodeSet" select="msxsl:node-set($filterResult)"/>
Run Code Online (Sandbox Code Playgroud)
但是你甚至不需要这样做:正如Alejandro所指出的那样,只需编写一个XPath表达式就可以得到你正在寻找的结果.有些应用程序的节点选择非常复杂,您必须使用一个node-set()
函数,但您的节点不是其中之一.
小智 7
看起来$Rows
变量是Result Tree Fragment类型的实例.
[]
除了字符串操作之外,您不能对RTF 执行任何操作(如过滤器表达式提供的操作):来自http://www.w3.org/TR/xslt#section-Result-Tree-Fragments
仅当在字符串上允许该操作时才允许对结果树片段执行操作(对字符串的操作可能涉及首先将字符串转换为数字或布尔值).特别是,它不允许使用
/
,//
以及[]
操作员对结果树片段.
除此之外,如果$Rows
节点集数据类型的实例如下,则所有显示的代码都可以简化:
<xsl:variable name="filterResult"
select="$Rows[(date=$filter1 or $filter1='')
and
(type=$filter2 or $filter2='')
and
(subject=$filter3 or $filter3='')]"/>
Run Code Online (Sandbox Code Playgroud)
有XSLT处理器(主要是每一个)提供node-set()
RTF到节点集转换的扩展功能的实现.
归档时间: |
|
查看次数: |
26956 次 |
最近记录: |