2011-12-06 182 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

@傑克:不客氣。 –