2010-12-20 61 views
1

仍然很難掌握一些較難的模板,任何幫助都會很棒。<XSL:for-each>跳過具有特定值的節點

現在我正在使用一個簡單的for-each循環來排序和顯示錶中的數據。我想做同樣的事情,但跳過下面的「State」=「Talking Out」的所有節點是我當前的樣式表,並且下面是我的XML。我想我可以在當前循環中添加一個for-each,忽略符合我的標準的節點。我逃避單引號,因爲它是一個更大的PHP腳本的一部分。

<?xml version="1.0" encoding="ISO-8859-1"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <table cellpadding="3" cellspacing="0" width="390"> 
     <tr> 
     <th style="text-align:left;"><span style="font:20px arial; font-weight:bold;">Agent Name</span></th> 
     <th style="text-align:center;"><span style="font:20px arial; font-weight:bold;">State</span></th> 
     <th style="text-align:center;"><span style="font:20px arial; font-weight:bold;">Time</span></th> 
     </tr> 
     <xsl:for-each select="NewDataSet/AgentSales"> 
<tr> 
<xsl:if test="(position() mod 2 = 1)"> 
    <xsl:attribute name="bgcolor">#cccccc</xsl:attribute> 
    </xsl:if> 

<xsl:if test="AgentSales[State=\'Talking Out\']"> 

    </xsl:if> 

     <td style="text-align:left;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="AgentName"/></span></td> 
     <td style="text-align:center;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="State"/></span></td> 
    <td style="text-align:center;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="time"/></span></td> 
</tr> 

     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

這裏是我的XML

<?xml version="1.0" encoding="ISO-8859-1"?> 
<NewDataSet> 
    <AgentSales> 
    <AgentName>MCCALLISTER AARON</AgentName> 
    <State>Talking Out</State> 
    <Reason /> 
    <time>9</time> 
    </AgentSales> 
    <AgentSales> 
    <AgentName>APPELHANS BARRY</AgentName> 
    <State>Talking Out</State> 
    <Reason /> 
    <time>1</time> 
    </AgentSales> 
    <AgentSales> 
    <AgentName>ARREDONDO KARLA</AgentName> 
    <State>Talking Out</State> 
    <Reason /> 
    <time>0</time> 
    </AgentSales> 
    <AgentSales> 
    <AgentName>WOOTERS CHAD</AgentName> 
    <State>Talking In</State> 
    <Reason /> 
    <time>5</time> 
    </AgentSales> 
    <AgentSales> 
    <AgentName>LANDINI EUGENE</AgentName> 
    <State>Not Ready</State> 
    <Reason>TRAINING</Reason> 
    <time>16</time> 
    </AgentSales> 
    <AgentSales> 
    <AgentName>BROWN EYES JONETTE</AgentName> 
    <State>Not Ready</State> 
    <Reason>TRAINING</Reason> 
    <time>13</time> 
    </AgentSales> 
</NewDataSet> 
+0

好問題,+1。查看我的答案,對代碼進行非常小的修改,以實現所需的新行爲。 :) – 2010-12-20 19:08:21

+0

這是不同的形式[旋轉背景顏色不使用for-each](http://stackoverflow.com/questions/4464490/rotate-tr-background-color-without-using-for-each)? – 2010-12-20 19:28:47

+0

@Alejandro我已經有了For Loop的工作,然後我意識到我不想說話了。我仍然在XSL周圍徘徊。所以如果我問兩次問題,你將不得不原諒我。 – Denoteone 2010-12-21 04:18:14

回答

2

雖然 「應用模板」 可能比 「的for-each」,也許這個例子可以告訴你它的力量似乎不舒服......

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <table cellpadding="3" cellspacing="0" width="390"> 
        <tr> 
         <th style="text-align:left;"><span style="font:20px arial; font-weight:bold;">Agent Name</span></th> 
         <th style="text-align:center;"><span style="font:20px arial; font-weight:bold;">State</span></th> 
         <th style="text-align:center;"><span style="font:20px arial; font-weight:bold;">Time</span></th> 
        </tr> 
        <xsl:apply-templates select="NewDataSet/AgentSales[State!='Talking Out']"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="AgentSales"> 
     <tr> 
      <xsl:if test="(position() mod 2 = 1)"> 
       <xsl:attribute name="bgcolor">#cccccc</xsl:attribute> 
      </xsl:if> 
      <td style="text-align:left;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="AgentName"/></span></td> 
      <td style="text-align:center;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="State"/></span></td> 
      <td style="text-align:center;"><span style="font:14px arial; font-weight:bold;"><xsl:value-of select="time"/></span></td> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 
+0

所以「」說所有其他模板在這裏,只有當他們沒有說出來?我很難讓自己的頭腦看起來像事物的樣式。我一直在問這個問題,但是如果你有任何幫助學習XSLT的在線資源,我會很感激你是否願意分享。謝謝! – Denoteone 2010-12-20 19:05:02

+0

@Denoteone:對於XSLT學習資源,請參閱我對此問題的回答:http://stackoverflow.com/questions/339930/any-good-xslt-tutorial-book-blog-site-online/341589#341589 – 2010-12-20 19:17:36

+1

@Denotenone:一個好的策略是讓自己做一個好的調試器,並且用來自Dimitre建議的一些來源的例子進行實驗。我喜歡來自http://oxygenxml.com的Oxygen。 – dacracot 2010-12-20 19:30:21

4

現在我正在使用一個簡單的for-each 循環來排序和顯示 表中的數據。我想要做同樣的事情 但跳過所有節點,其中 「國家」 是=爲 「說着拿出」

只需更換:

<xsl:for-each select="NewDataSet/AgentSales"> 

<xsl:for-each select="NewDataSet/AgentSales[not(State='Talking Out')]"> 
+0

我可以問,爲什麼你不喜歡在字符串值比較中使用!=運算符?只是一個風格或更多的問題? – Flack 2010-12-20 20:30:51

+0

@Flack:因爲不應該使用'!='操作符 - 這太冒險了。爲了避免在通用(節點集)比較中使用它的風險,請不要使用它。 – 2010-12-20 20:34:19

+1

@Flack:'State!='Talking Out''表示「有一個狀態子元素的值不等於'Talking Out'」,而'not(State ='Talking Out')'表示「沒有狀態子元素的值等於'說出'「。區別是混亂。 – LarsH 2010-12-20 21:26:20

相關問題