2009-10-30 66 views
1

我有一個for-each,當沒有任何輸出時,我想顯示一些默認文本。for-each no results text

如果我有...

<xsl:for-each select='xpath'> Some content for each matching element result. </xsl:for-each> 

我想的是:

<xsl:for-each select='xpath'> 
    <xsl:output-this-when-there-is-content> Some content for each matching element result. </xsl:output-this-when-there-is-content> 
    <xsl:no-results-output> Some content for when the for-each finds no matches. </xsl:no-results-output> 
</xsl:for-each> 

誰能告訴我如何做到這一點,好嗎?

感謝,

馬特

+0

對不起,我不夠具體。如果我有... 每個匹配元素的結果都有一些內容。 的 我想是: <的xsl:for-每個選擇= '的xpath'> 的 一些內容爲每個匹配元素結果。 for-each找不到匹配項時的一些內容。 2009-10-30 11:06:23

回答

3

假設你有:

<xsl:for-each select="xpath"> ... 

的,你可以這樣做:

<xsl:choose> 
    <xsl:when test="xpath"> 
     <xsl:for-each select="xpath"> ... 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>Some default text</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 

要避免的XPath的雙重考驗(和重複)你可能可以使用一個xsl:variable,就像下面的東西g(語法可能有點不對,但粗略的想法應該是正確的)。

<xsl:choose> 
    <xsl:variable name="elems" select="xpath"/> 
    <xsl:when test="$elems"> 
     <xsl:for-each select="$elems"> ... 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>Some default text</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 
+0

謝謝,這正是我所需要的。有沒有比測試xpath查詢兩次更快的方法? – 2009-10-30 11:13:53

+0

謝謝,我沒有考慮使用變量來存儲測試結果 :) – 2009-10-31 09:13:47

+0

將變量放在選擇塊的外部。 – Dacto 2012-06-05 23:27:56

-1

我想這樣的某物將是一件好事:

If (x!=null) 
{ 
console.write("Default Text")} 
else 
{ 
foreach (var y in x) 
{ 

     Console.Writeline(y); 
    //... 
} 
} 
2

爲了避免格雷格山毛櫸提出的<xsl:choose>解決方案的詳細程度,你可以這樣做:

<xsl:variable name="elems" select="xpath"/> 

<xsl:for-each select="$elems"> 
    <!-- ... --> 
</xsl:for-each> 

<xsl:if test="not($elems)"> 
    <xsl:text>Some default text</xsl:text> 
</xsl:if> 

<xsl:variable>是爲了提高效率,它避免了兩次執行相同的查詢。

<xsl:for-each>只有在$elems中有任何節點時才運行,<xsl:if>只在沒有節點時運行。