添加多个过滤器

时间:2011-12-06 21:29:13

标签: xslt

正如我在这篇文章中所提到的: dynamic multiple filters in xsl 基本上,我想使用“for loop”将多个过滤器应用于我的xml,这些过滤器是动态的,来自其他一些xml

像这样:

foreach(list/field[@ProgramCategory=$Country][not(contain(@Program,$State1][not(contain(@Program,$State2][not(contain(@Program,$State3][not(contain(@Program,$Staten])

问题是我可以得到n不。我正在通过其他xml的循环获得的状态。

我无法使用Dimitre建议的document()函数,所以我想通过以下方式实现它:

 <xsl:variable name="allprograms">
    <xsl:for-each select="/list2/field2">

            <xsl:text disable-output-escaping="yes">[not(contains(@Program,'</xsl:text><xsl:value-of select="@ProgramID"></xsl:value-of><xsl:text disable-output-escaping="yes">'))]</xsl:text>
                                                            </xsl:for-each>
</xsl:variable> 

给我这样的东西:

[not(contains(@Program,'Virginia'))][not(contains(@Program,'Texas'))][not(contains(@Program,'Florida'))]

我想在上面的for循环中使用上面的值作为过滤器,我不知道如何实现

<xsl:for-each="list/field[not(contains(@Program,'Virginia'))][not(contains(@Program,'Texas'))][not(contains(@Program,'Florida'))]">

在此之前我还有一个for循环来过滤美国

xsl:for-each="list/field $allprograms">
   <xsl:value-of select="@ows_ID" />
</xsl:for-each>

我希望我的回答是1082,1088 ..

如果有任何混淆,我也可以在这里添加xml。

1 个答案:

答案 0 :(得分:0)

杰克,

从以前的解决方案中,您只需要添加:

 <xsl:param name="pFilteredStates"> 
  <state>Virginia</state> 
  <state>Texas</state> 
  <state>Florida</state> 
 </xsl:param> 

以下内容(更改依赖于document()函数的当前变量定义):

<xsl:variable name="vFiltered" select= 
  "ext:node-set($pFilteredStates)/* 
  "/> 

需要将"ext:"前缀绑定到此命名空间(这是EXSLT命名空间 - 如果您的XSLT处理器未实现exslt:node-set(),那么您需要找到xxx:node-set()它实现的扩展,或告诉我们什么是您的XSLT处理器,人们将提供此信息):

"http://exslt.org/common"

因此,您的<xsl:stylesheet>可能如下所示:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">

我仍然建议转换的发起者应该传递$pFilteredStates参数 - 在这种情况下,您可以删除$vFiltered的定义,并用$ pFilteredStates替换每个引用。转型应该可行。