2009-10-30 9 views
1

У меня есть для каждого, и когда ничего нет, я бы хотел отобразить текст по умолчанию.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> 

Может кто-нибудь сказать мне, как это сделать, пожалуйста?

Спасибо,

Matt

+0

Извините, я не был достаточно конкретным. Если у меня есть ... Некоторое содержимое для каждого результата совпадающего элемента. То, что я хотел бы это: Некоторые материалы для каждого результата совпадающего элемента. Некоторое содержимое, когда для каждого не найдено совпадений.

ответ

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 дважды? –

+0

Спасибо, я не рассматривал использование переменной для хранения результата теста :) –

+0

Поместите переменную за пределы блока выбора. – Dacto

-1

Я думаю, STH, как это было бы хорошо:

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> запускается только в том случае, если их нет.