0
<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 元素,我在表中创建一行。

无论如何,第三列的单元格都有白色背景色。

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

但是,如果任何 A 元素中至少有一个 @i 属性为 True,则前 2 列(第 1 行)的单元格必须为黄色,以表明存在为 True 的 @i。

请帮我弄清楚。在过去的几天里,它变成了一场噩梦。先感谢您。

完整的 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>
4

2 回答 2

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>
于 2012-07-11T11:54:41.580 回答
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 元素的模板

于 2012-07-11T13:53:36.843 回答