2011-02-03 72 views
1

我認爲只要告訴for-each只選擇「Site」等於「PB」但運行腳本的top_coach_sales_vw它不循環XML中的任何數據。如何篩選XSL中for-each循環中顯示的內容

我逃避單引號,因爲它是PHP回聲的一部分。

<xsl:for-each select="NewDataSet/top_coach_sales_vw[Site==\'PB\']"> 
     <td><xsl:value-of select="name"/></td> 
     <td><xsl:value-of select="Site"/></td> 
     <td><xsl:value-of select="Status"/></td> 
</xsl:for-each> 

XML:

<NewDataSet> 
    <top_coach_sales_vw> 
     <name>Mike</name> 
     <Site>PB</Site> 
     <State>Ready</State> 
    </top_coach_sales_vw> 

    <top_coach_sales_vw> 
     <name>Bill</name> 
     <Site>EL</Site> 
     <State>Talking</State> 
    </top_coach_sales_vw> 

    <top_coach_sales_vw> 
     <name>Ted</name> 
     <Site>PB</Site> 
     <State>Ready</State> 
    </top_coach_sales_vw> 
</NewDataSet> 
+0

問得好,+1。請參閱我的答案以解釋所提供的代碼中的所有問題,以及完整的解決方案。 :) – 2011-02-03 16:30:36

+0

小問題,但是你可以用`PB`替換``,因爲它保證具有相同的值。它會讓你的xslt略微更有效率。另外,我建議在PHP中使用heredoc/nowdoc語法來處理字符串文字時,它是一個XML文檔;節省您擔心轉義的東西:http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc – Flynn1179 2011-02-03 16:40:21

回答

3
<xsl:for-each select="NewDataSet/top_coach_sales_vw[Site==\'PB\']"> 

沒有與此幾個問題:

  1. 有XPath中沒有==運營商。您可能需要=比較運算符。

  2. \'PB\'在語法上是無效的 - 你可能是指剛剛'PB'

  3. NewDataSet是所提供的XML文檔的頂級元素。如果以上<xsl:for-each>指令位於任何與該文檔的根目錄(/)不匹配的模板中,則表達式NewDataSet/top_coach_sales_vw[Site='PB']將不會選擇任何節點,因爲這是一個相對錶達式,將從當前節點(即模板匹配)。

解決方案

用途:

<xsl:for-each select="/NewDataSet/top_coach_sales_vw[Site='PB']"> 
1

XSLT使用單個=,因爲它是平等的運營商。

此外,您正在循環體中選擇Status,儘管您列出的xml示例包含State個元素 - 這可能是一個疏忽。