XSLT中的多个条件

时间:2015-01-20 15:04:02

标签: php xml xslt xslt-2.0

我必须使用XSLT将我的XML文档转换为Bootstrap表。我在使用PHP之前已经完成了它,它非常简单,我试图在XSLT中进行调整。

使用PHP,我做了类似的事情:

while($line = $request->fetch(PDO::FETCH_ASSOC)) 
{
   echo '<tr ';
   switch($line["category"])
   {
     case "Movie" : echo "class='info'";break;
     case "Tv show" : echo "class='danger'";break;
     case "Music" : echo "class='success'";break;
   }
   echo ' >';
   ...
   echo "</tr>";
}

我尝试在XSLT中执行类似的代码(不使用连接,因为我们不能):

<xsl:for-each select="demands/demand">
    <xsl:choose> 
        <xsl:when test="category  = 'Movie'"> 
            <tr class="info">
        </xsl:when> 
        <xsl:when test="category = 'Tv show'"> 
            <tr class="danger">
        </xsl:when> 
        <xsl:when test="categorie = 'Music'"> 
            <tr class="success">
        </xsl:when> 
    </xsl:choose>
    ...
    </tr>
</xsl:for-each>

那不起作用(&#34;开始和结束标签不匹配:tr line&#34;)因为只有一个结束tr标签。那有什么解决方案吗?我怎么能以最简单的方式做到这一点?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

正确的方法是使用

<xsl:template match="demands/demand[category = 'Movie']">
  <tr class="info">
    <xsl:apply-templates/>
  </tr>
</xsl:template>

<xsl:template match="demands/demand[category = 'Tv show']">
  <tr class="danger">
    <xsl:apply-templates/>
  </tr>
</xsl:template>

<xsl:template match="demands/demand[category = 'Music']">
  <tr class="success">
    <xsl:apply-templates/>
  </tr>
</xsl:template>

然后将...放入由demand元素内容的模板生成。

答案 1 :(得分:3)

Martin Honnen的解决方案的一个变种,是代码重用稍多,

<xsl:template match="demands/demand">
  <tr>
    <xsl:attribute name="class">
      <xsl:apply-templates select="@category"/>
    </xsl:attribute>
    <xsl:apply-templates/>
  </tr>
</xsl:template>

<xsl:template match="@category[. = 'Movie']"
>info</xsl:template>

<xsl:template match="@category[. = 'Tv show']"
>danger</xsl:template>

<xsl:template match="@category[. = 'Music']"
>success</xsl:template>