XSLT表单元格取决于属性值

时间:2012-07-11 08:00:32

标签: xml xslt html-table

<xsl:for-each select="A">
<tr>            

<xsl:choose>
<xsl:when test="@a='True'">
<td bgcolor="#FFFF00"><xsl:value-of select="../@e"/></td>
<td bgcolor="#FFFF00"><xsl:value-of select="../@b"/></td>
<td bgcolor="#999999"><xsl:value-of select="@be"/></td>
<xsl:for-each select="T">
<td bgcolor="#FFFF00"><xsl:value-of select="@o"/></td>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<td bgcolor="#999999"><xsl:value-of select="../@e"/></td>
<td bgcolor="#999999"><xsl:value-of select="../@b"/></td>
<td bgcolor="#999999"><xsl:value-of select="@be"/></td>
<xsl:for-each select="T">
<td bgcolor="#999999"><xsl:value-of select="@o"/></td>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>

</tr>

我的xslt的这一部分构成了一个表的行。

列是../ @ e,.. / @ b,@ be,@ o

对于每个A元素,我在表格中创建一行。

第3列的单元格无论如何都具有白色背景颜色

所以: 首先,前两列不满,只有第一列的第一个单元格必须是满的。它们的所有其他细胞都是空的。

但是如果任何A元素中至少有一个@i属性为True,则前2列(1ST ROW)的单元格必须为黄色,表示有@我是真的。

请帮我解决一下。在过去的几天里,它已经变成了一场噩梦。 提前谢谢。

完整的XSLT转换是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

<!-- param values may be changed during the XSL Transformation -->
<xsl:param name="shared_item_name"> Animal </xsl:param>
<xsl:param name="description"> Birth </xsl:param>
<xsl:param name="properties"> Kind </xsl:param>

<xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>Problem</title>
        </head>
        <body>
            <xsl:apply-templates/>
        </body>
    </html>
</xsl:template>


<xsl:template match="AA">
    <table border="1" cellspacing="0">
        <tr bgcolor="#9acd32">
            <th> <xsl:value-of select="$shared_item_name" /> </th>
            <th> <xsl:value-of select="$description" /> </th>
            <th> <xsl:value-of select="$properties" /> </th>
        <xsl:for-each select="IRO[position()=1]/P[position()=1]/T">
            <th> <xsl:value-of select="@s" /> </th>
        </xsl:for-each>
        </tr>               

<xsl:for-each select="AI">

    <xsl:for-each select="A">

        <tr>

        <xsl:if test="position()=1">
        <td><xsl:value-of select="../@e"/></td>
        <td bgcolor="#999999"><xsl:value-of select="../@b"/></td>
        </xsl:if>

        <xsl:if test="not(position()=1)">
        <td></td>
        <td></td>
        </xsl:if>

        <td bgcolor="#999999"><xsl:value-of select="@be"/></td>

        <xsl:choose>
        <xsl:when test="@a='True'">
        <xsl:for-each select="T">
        <td bgcolor="#FFFF00"><xsl:value-of select="@o"/></td>
        </xsl:for-each>
        </xsl:when>
        <xsl:otherwise>
        <xsl:for-each select="T">
        <td bgcolor="#999999"><xsl:value-of select="@o"/></td>
        </xsl:for-each>
        </xsl:otherwise>
        </xsl:choose>

        </tr>

    </xsl:for-each>

    <xsl:for-each select="AI">
    <xsl:for-each select="A">

        <tr>            

        <xsl:choose>
        <xsl:when test="@i='True'">
        <td bgcolor="#FFFF00"><xsl:value-of select="../@e"/></td>
        <td bgcolor="#FFFF00"><xsl:value-of select="../@b"/></td>
        <td bgcolor="#999999"><xsl:value-of select="@be"/></td>
        <xsl:for-each select="T">
        <td bgcolor="#FFFF00"><xsl:value-of select="@o"/></td>
        </xsl:for-each>
        </xsl:when>
        <xsl:otherwise>
        <td bgcolor="#999999"><xsl:value-of select="../@e"/></td>
        <td bgcolor="#999999"><xsl:value-of select="../@b"/></td>
        <td bgcolor="#999999"><xsl:value-of select="@be"/></td>
        <xsl:for-each select="T">
        <td bgcolor="#999999"><xsl:value-of select="@o"/></td>
        </xsl:for-each>
        </xsl:otherwise>
        </xsl:choose>

        </tr>
    </xsl:for-each>

    </xsl:for-each>

    </xsl:for-each>

</table>
</xsl:template>
    </xsl:stylesheet>

2 个答案:

答案 0 :(得分:2)

这是一次尝试,但您的要求缺乏一定的精确度。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

<xsl:param name="shared_item_name"> Shared Item Name </xsl:param>
<xsl:param name="description"> Description </xsl:param>
<xsl:param name="properties"> Properties </xsl:param>

<xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>Problem</title>
        </head>
        <body>
            <xsl:apply-templates/>
        </body>
    </html>
</xsl:template>


<xsl:template match="IR">
    <table border="1" cellspacing="0">
        <tr bgcolor="#9acd32">
            <th> <xsl:value-of select="$shared_item_name" /> </th>
            <th> <xsl:value-of select="$description" /> </th>
            <th> <xsl:value-of select="$properties" /> </th>
        <xsl:for-each select="IRO[1]/P[1]/T">
            <th> <xsl:value-of select="@s" /> </th>
        </xsl:for-each>
        </tr>               
        <xsl:apply-templates/>
    </table>
</xsl:template>

<xsl:template match="P">
    <tr>
        <xsl:choose>
            <xsl:when test='count(preceding-sibling::P)=0'>
                <xsl:variable name='c'>
                    <xsl:choose>
                        <xsl:when test='(@i="True") or (count(following-sibling::P[@i="True"]) &gt; 0)'>#FFFF00</xsl:when>
                        <xsl:otherwise>#999999</xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <td><xsl:attribute name='bgcolor'><xsl:value-of select='$c' /></xsl:attribute><xsl:value-of select='../@n' /></td>
                <td><xsl:attribute name='bgcolor'><xsl:value-of select='$c' /></xsl:attribute></td>
                <td bgcolor="#999999"><xsl:value-of select='@dn' /></td>
            </xsl:when>
            <xsl:otherwise>
                <td></td>
                <td></td>
                <td bgcolor="#999999"><xsl:value-of select='@dn' /></td>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:apply-templates />
    </tr>
</xsl:template>    

<xsl:template match="T">
    <td>
        <xsl:attribute name='bgcolor'>
            <xsl:choose>
                <xsl:when test='../@i="True"'>#FFFF00</xsl:when>
                <xsl:otherwise>#999999</xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
        <xsl:value-of select='@v' />
    </td>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

附加要求:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

<xsl:param name="shared_item_name"> Shared Item Name </xsl:param>
<xsl:param name="description"> Description </xsl:param>
<xsl:param name="properties"> Properties </xsl:param>

<xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
            <title>Problem</title>
        </head>
        <body>
            <xsl:apply-templates/>
        </body>
    </html>
</xsl:template>


<xsl:template match="IR">
    <table border="1" cellspacing="0">
        <tr bgcolor="#9acd32">
            <th> <xsl:value-of select="$shared_item_name" /> </th>
            <th> <xsl:value-of select="$description" /> </th>
            <th> <xsl:value-of select="$properties" /> </th>
        <xsl:for-each select="IRO[1]/P[1]/T">
            <th> <xsl:value-of select="@s" /> </th>
        </xsl:for-each>
        </tr>               
        <xsl:apply-templates/>
    </table>
</xsl:template>

<xsl:template match="/IR/IRO/P">
    <tr>
        <xsl:choose>
            <xsl:when test='count(preceding-sibling::P)=0'>
                <xsl:variable name='c'>
                    <xsl:choose>
                        <xsl:when test='(@i="True") or (count(following-sibling::P[@i="True"]) &gt; 0)'>
                            <xsl:choose>
                                <xsl:when test='count(../descendant::P[@i="True"]) &gt; 0'>#ff0000</xsl:when>
                                <xsl:otherwise>#FFFF00</xsl:otherwise>
                            </xsl:choose>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:choose>
                                <xsl:when test='count(../descendant::P[@i="True"]) &gt; 0'>#FF6600</xsl:when>
                                <xsl:otherwise>#999999</xsl:otherwise>
                            </xsl:choose>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <td><xsl:attribute name='bgcolor'><xsl:value-of select='$c' /></xsl:attribute><xsl:value-of select='../@n' /></td>
                <td><xsl:attribute name='bgcolor'><xsl:value-of select='$c' /></xsl:attribute></td>
                <td bgcolor="#999999"><xsl:value-of select='@dn' /></td>
            </xsl:when>
            <xsl:otherwise>
                <td></td>
                <td></td>
                <td bgcolor="#999999"><xsl:value-of select='@dn' /></td>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:apply-templates />
    </tr>
</xsl:template>    

<xsl:template match="/IR/IRO/IRO/P">
    <tr>
        <xsl:choose>
            <xsl:when test='count(preceding-sibling::P)=0'>
                <xsl:variable name='c'>
                    <xsl:choose>
                        <xsl:when test='(@i="True") or (count(following-sibling::P[@i="True"]) &gt; 0)'>#FFFF00</xsl:when>
                        <xsl:otherwise>#999999</xsl:otherwise>
                    </xsl:choose>
                </xsl:variable>
                <td><xsl:attribute name='bgcolor'><xsl:value-of select='$c' /></xsl:attribute><xsl:value-of select='../@n' /></td>
                <td><xsl:attribute name='bgcolor'><xsl:value-of select='$c' /></xsl:attribute></td>
                <td bgcolor="#999999"><xsl:value-of select='@dn' /></td>
            </xsl:when>
            <xsl:otherwise>
                <td></td>
                <td></td>
                <td bgcolor="#999999"><xsl:value-of select='@dn' /></td>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:apply-templates />
    </tr>
</xsl:template>    

<xsl:template match="T">
    <td>
        <xsl:attribute name='bgcolor'>
            <xsl:choose>
                <xsl:when test='../@i="True"'>#FFFF00</xsl:when>
                <xsl:otherwise>#999999</xsl:otherwise>
            </xsl:choose>
        </xsl:attribute>
        <xsl:value-of select='@v' />
    </td>
</xsl:template>

</xsl:stylesheet>

在这种情况下,必须区分2个P元素级别的模板