【问题标题】:Sharepoint XSLT Dynamic filteringSharepoint XSLT 动态过滤
【发布时间】:2009-12-10 05:39:51
【问题描述】:

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

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

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

以前有人试过吗?

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

任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    你不能做你似乎在这里尝试的事情。 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 的自然部分。 (例如,您可以使用&amp;#13;。如果您的标题不能是多行的,这是非常安全的。)

    【讨论】:

    • 那么有没有办法创建一个真正的动态过滤器?有点像你会在 php/asp 中做的?我喜欢你的分隔符想法,但由于某种原因,当我使用 在我的 SP Designer 中,它崩溃并创建了价值 100 行的 - 如果我试图在 SP Designer 中打开文件,它会出现空白,但文件大小为 145kb。我一直在寻找更清洁的解决方案,但我想我不能太挑剔,对吧?
    • 您知道&amp;#13; 是ASCII CR 吗?只是在说'。 ;) 我真的不明白这会如何使整个事情崩溃。我通常在普通的文本编辑器中编辑我的 XSLT 文件,我没有使用 SP Designer 的经验。分隔字符串方法是创建真正动态过滤器的最简单方法。它或多或少是您想要的,只是以符合 XSLT/XPath 的方式。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2017-05-09
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多