2011-12-06 283 views
0

正如我在这篇文章中所提到的: dynamic multiple filters in xsl 基本上,我希望将多个过滤器适用于使用“for循环”我的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的建议,所以我想通过实现它的我不能使用文件()函数:

<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'))]"> 

在th是我也有一个for循环过滤美国

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

我想我的答案是1082,1088 ..

我可以在这里添加XML太多,如果有任何混淆..

回答

0

杰克,

从前面的解决方案,您只需要添加到此:

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

的FO llowing(改变当前的变量定义,依赖于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`取代它和改造应该工作正常。

+0

酷......它的工作......谢谢.... – Jack

+0

@杰克:不客气。 –