2016-12-07 1 views
3

Мне нужно цвет строк в зависимости от значений данных. Если отдел «CIT», строка должна быть голубой; если это «COMP», желтый; если это «IS», розовый; что-нибудь еще, серое. У меня есть все, что нужно, но я становлюсь только серым. Это единственное, с чем у меня возникла проблема.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:when Ваши тесты против dept терпят неудачу из-за ведущих и конечных пробелов.

Тест на normalize-space(dept), а не dept, чтобы устранить эту проблему.

0

Есть несколько вещей, которые вы должны исправить в вашем XML или предусмотреть в вашем XSLT, чтобы обрезать пробелы,

Есть пробелы в вашем node, следовательно, ваше состояние было упущение, узел

Issue :

<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: noble. Избегая кода исправления, который потребляет несогласованный 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.

Смежные вопросы