2009-10-30 65 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>只在没有节点时运行。