1

我想创建一个基于变量的动态行过滤器。我有下面的代码:Sharepoint XSLT动态过滤

<xsl:variable name="filter" select="contain(@Title, 'title1') or contain(@Title, 'title2')"/> 
<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[string($filter)]" /> 

这不幸似乎不工作,我最终与所有行。我猜这个过滤器实际上并没有被应用,因为我可以复制并粘贴$ filter变量的输出,将它复制并粘贴到Row []中,并且它按预期工作。

以前有人试过这样做吗?

如果你想知道的过滤器变量是使用像分割字符串模板实际创建: - - 标题2 TITLE1 TITLE3 并返回像一个字符串: 包含(@Title,“TITLE1”)或含有(@Title, '标题2')或含有(@Title, 'TITLE3')

任何帮助将不胜感激!

回答

3

你不能做你仿佛可以尝试在这里。一个XPath表达式是原子的,你不能保存它的一部分并重新使用它们(除了它是,而不是contain())。

你需要的东西是这样的:

<xsl:variable name="Rows" select=" 
    /dsQueryResponse/Rows/Row[ 
    contains(@Title, 'title1') or contains(@Title, 'title2') 
    ] 
" /> 

你的“过滤器”不会,因为如果$filter是一个字符串的工作,那么它是一个字符串,没有别的。它仅仅因为看起来像XPath而没有神奇的含义。 ;-)

<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[string($filter)]" /> 

计算为一个非空字符串作为谓词。并且任何非空字符串的计算结果都为true,这使得表达式返回每个节点。

如果您想根据输入字符串动态过滤器,那么这样做:

<xsl:variable name="filter" select="'|title1|title2|title3|'" /> 
<xsl:variable name="Rows" select=" 
    /dsQueryResponse/Rows/Row[ 
    contains(
     $filter, 
     concat('|', @Title, '|') 
    ) 
    ] 
" /> 

使用的分隔符还可以防止“title11”从显示出来,如果你寻找“TITLE1”。

确保您的过滤器总是开始,以分隔符结束,使用分隔符是相当不可能发生过由于@Title自然的一部分。 (例如,你可以使用&#13;。如果你的标题不能为多行,这是相当安全的。)

+0

那么有没有方法来创建一个真正的动态过滤器?有点像你会在PHP/ASP中做的? 虽然我喜欢你的分隔符想法,但由于某种原因,当我在SP Designer中使用 时,它崩溃并创建了100行,值为 - 如果我试图在SP Designer中打开该文件,它会空白,但文件大小是145kb。 我正在寻找更清洁的解决方案,但我想我不能太挑剔,对吧? – TeckniX 2009-12-09 23:07:54

+0

你意识到' '是ASCII CR?只是在说'。 ;)我真的不知道这会如何崩溃整个事情。我通常在普通的文本编辑器中编辑我的XSLT文件,我没有使用SP Designer的经验。分隔字符串方法是创建真正动态过滤器的最简单方法。它只是以符合XSLT/XPath的方式或多或少地符合您的意图。 – Tomalak 2009-12-09 23:41:02