2016-12-07 15 views
3

我需要根据数据值对行进行着色。如果部门是“CIT”,则该行必须是青色的;如果它是“COMP”,黄色;如果它是“是”,粉红色;别的,灰色。我拥有一切,因为它需要,但我只得到灰色。这是我遇到问题的唯一方法。XSLT无法根据元素值对行着色?

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> 

回答

1

xsl:whendept测试,因为开头和结尾空格的失败。

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

0

有情侣的,你需要在你的XML修复或提供资金在XSLT修剪空间的东西,

,我们在您node空间,因此你的情况是失败,

问题节点:

<dept> CIT </dept> 

正确的节点:

<dept>CIT</dept> 

我有固定的XML,你可以找到工作:http://xsltransform.net/ejivdHb/28

或者您可以使用以下方法来解决你的XSL,

  1. 使用正常化空间()

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

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

通常作为开发人员,我们应该使代码更健壮,而不是更改输入数据以适应现有代码。鉴于我已经[已经显示](http://stackoverflow.com/a/41008397/290085)OP如何使XSLT更健壮,这是相当奇怪的(而且相当适得其反)你现在建议OP改变改为输入XML。 – kjhughes

+0

@kjhughes OP XML不一致。只有一些节点具有导致这些失败条件的空间。所以对我来说,最好是建议OP使输入XML保持一致。我希望你对此表示赞同。 – ScanQR

+0

修复产生不一致XML的代码:高贵。通过手动更改XML来避免修复消耗不一致XML的代码:并非高贵。 – kjhughes

0

这里是写你的代码,不仅解决了空白问题的一个更好的方式,它也做它的“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:apply-templates select="catalog/semester"/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="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:apply-templates select="class"/> 
    </table> 
</xsl:template> 

<xsl:template match="class[normalize-space(dept)='CIT']" 
    mode="color">cyan</xsl:template> 
<xsl:template match="class[normalize-space(dept)='IS']" 
    mode="color">pink</xsl:template> 
<xsl:template match="class[normalize-space(dept)='COMP']" 
    mode="color">yellow</xsl:template> 
<xsl:template match="class" 
    mode="color">grey</xsl:template> 

<xsl:template match="class"> 
    <tr bgcolor="cyan"> 
    <xsl:attribute name="bgcolor"> 
     <xsl:apply-templates select="." mode="color"/> 
    </xsl:attribute> 
    <td><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:template> 

</xsl:stylesheet> 

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

相关问题