XSLT 中的多个条件
Multiple conditions in XSLT
我必须使用 XSLT 将我的 XML 文档转换为 Bootstrap table。我在使用 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>
那是行不通的 ("Opening and ending tag mismatch: tr line"),因为只有一个结束 tr 标签。有什么解决办法吗?我怎样才能以最简单的方式做到这一点?
感谢您的帮助。
正确的方法是使用
<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
元素的内容生成的模板中。
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>
我必须使用 XSLT 将我的 XML 文档转换为 Bootstrap table。我在使用 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>
那是行不通的 ("Opening and ending tag mismatch: tr line"),因为只有一个结束 tr 标签。有什么解决办法吗?我怎样才能以最简单的方式做到这一点?
感谢您的帮助。
正确的方法是使用
<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
元素的内容生成的模板中。
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>