XSLT无法根据元素值对行进行着色?

时间:2016-12-07 01:23:49

标签: xml xslt

我需要根据数据值对行进行着色。如果部门是" CIT"该行必须是青色的;如果它" COMP",黄色;如果它" IS",粉红色;什么别的,灰色的。我拥有所需的一切,但我只是灰色。这是我遇到问题的唯一方法。

XML代码:

<?xml version="1.0" encoding="UTF-8"?>
  <catalog>
    <semester name="Fall 2016">
       <class>
           <dept> CIT </dept>
           <number>270/L</number>
           <title>Integrative Programming</title>
           <prereq>CIT 160/L, COMP 182/L; MATH 103, 150A OR 255A</prereq>
       </class>

    <class>
    <dept> SOC  </dept>
    <number>340</number>
    <title>Sociology Of Work</title>
    <prereq>SOC 150</prereq>
   </class>
</semester>
<semester name="Spring 2017">
<class>
    <dept> CIT </dept>
    <number>360</number>
    <title>System Management</title>
    <prereq>CIT 210/L, 270/L</prereq>
</class>
</semester>
<semester name="Fall 2017">
    <class>
    <dept> CIT </dept>
    <number>480/L</number>
    <title> CIT System Design And Implementation1  </title>
    <prereq>COMP 484/L, IS 451</prereq>
</class>
<class>
    <dept> COMP </dept>
    <number>424</number>
    <title>Computer System Security</title>
    <prereq>CIT 360, IS 435</prereq>
</class>
<class>
    <dept> COMP </dept>
    <number>484/L</number>
    <title> Web Engineering I </title>
    <prereq>CIT 360</prereq>
</class>
<class>
    <dept> COMP </dept>
    <number>485</number>
    <title>Human Computer Interaction</title>
    <prereq>CIT 360, IS 451</prereq>
</class>
</semester>
<semester name="Spring 2018">
    <class>
    <dept> CIT </dept>
    <number>481/L</number>
    <title>CIT System Design And Implementation II</title>
    <prereq>CIT 480/L</prereq>
</class>

XSLT代码:     

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <html>
        <body>
            <h2>Path to Graduation</h2>
            <xsl:for-each select="catalog/semester">
                <h2><xsl:value-of select="@name"/></h2>
                <table border="1">
                    <tr bgcolor="lightgreen">
                        <th style="align:center;width:120px;">Catalog Number</th>
                        <th style="align:center;width:350px;">Title</th>
                        <th style="align:center;width:300px;">Prerequisites</th>
                    </tr>
                    <xsl:for-each select="class">
                        <xsl:choose>
                            <xsl:when test="dept='CIT'">
                                <tr bgcolor="cyan">
                                    <td align="center"><xsl:value-of select="dept"/>
                                    <xsl:value-of select="number"/></td>
                                    <td align="center"><xsl:value-of select="title"/></td>
                                    <td align="center"><xsl:value-of select="prereq"/></td>
                                </tr>
                            </xsl:when>
                            <xsl:when test="dept='IS'">
                                <tr bgcolor="pink">
                                    <td align="center"><xsl:value-of select="dept"/>
                                    <xsl:value-of select="number"/></td>
                                    <td align="center"><xsl:value-of select="title"/></td>
                                    <td align="center"><xsl:value-of select="prereq"/></td>
                                </tr>
                            </xsl:when>

                            <xsl:when test="dept='COMP'">
                                <tr bgcolor="yellow">
                                    <td align="center"><xsl:value-of select="dept"/>
                                    <xsl:value-of select="number"/></td>
                                    <td align="center"><xsl:value-of select="title"/></td>
                                    <td align="center"><xsl:value-of select="prereq"/></td>
                                </tr>

                            </xsl:when>
                            <xsl:otherwise>
                                <tr bgcolor="grey">
                                    <td align="center"><xsl:value-of select="dept"/>
                                    <xsl:value-of select="number"/></td>
                                    <td align="center"><xsl:value-of select="title"/></td>
                                    <td align="center"><xsl:value-of select="prereq"/></td>
                                </tr>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:for-each>
                </table>
            </xsl:for-each>
        </body>
    </html>
</xsl:template>

3 个答案:

答案 0 :(得分:1)

由于前导和尾随空格,您对xsl:when的{​​{1}}次测试失败。

针对dept而不是normalize-space(dept)进行测试,以消除此问题。

答案 1 :(得分:0)

您需要在XML中修复或在XSLT中进行调整以修剪空格,

node中有空格,因此您的情况失败,

问题节点:

<dept> CIT </dept>

正确的节点:

<dept>CIT</dept>

我修复了您可以找到工作的XML:http://xsltransform.net/ejivdHb/28

或者您可以使用以下方法修复XSL,

  1. 使用normalize-space()

    <xsl:when test="normalize-space(dept)='CIT'">
    
  2. 使用正则表达式。

    <!-- (XSL 2.0) -->
    <xsl:when test="replace(dept, '^\s+|\s+$', '')='CIT'">
    

答案 2 :(得分:0)

这是一种更好的编写代码的方法,它不仅可以解决空白问题,还可以使用模板规则“XSLT方式”。

$value = utf8_encode($value);

下周的课程:HTML5表格模型和CSS。