Sharepoint XSLT动态过滤

时间:2009-12-09 21:21:47

标签: sharepoint xslt sharepoint-2007 filtering sharepoint-designer

我正在尝试基于变量创建动态行过滤器。我有以下代码:

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

遗憾的是,这似乎不起作用,我最终得到了所有行。我猜测过滤器实际上并未应用,因为我可以复制并粘贴$ filter变量的输出,将其复制并粘贴到Row []中,并且它按预期工作。

之前有人试图这样做吗?

如果您想知道过滤器变量实际是使用分割字符串的模板创建的,例如: title1 - title2 - title3 并返回一个字符串,如: 包含(@标题,'title1')或包含(@标题,'标题2')或包含(@标题,'标题3')

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

你不能做你在这里尝试的事情。 XPath表达式是原子的,您无法保存它的一部分并重新使用它们(除此之外它是contains(),而不是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, '|')
    )
  ]
" />

如果您查找“title1”,分隔符的使用也会阻止“title11”显示。

确保您的过滤器始终以分隔符开头和结尾,并使用一个合理不太可能作为@Title的自然部分出现的分隔符。 (例如,你可以使用&#13;。如果你的标题不能是多行的,这是非常安全的。)