我正在尝试基于变量创建动态行过滤器。我有以下代码:
<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')
非常感谢任何帮助!
答案 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
的自然部分出现的分隔符。 (例如,你可以使用
。如果你的标题不能是多行的,这是非常安全的。)