正如我在这篇文章中所提到的: 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。
答案 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替换每个引用。转型应该可行。