Бандинг с xsl - PullRequest
       32

Бандинг с xsl

1 голос
/ 27 мая 2009

Я начинаю думать, что проблема не в банд-коде. Каким-то образом счет не получается правильно. Может ли это быть либо в XML, у меня есть ок. 150 узлов тематического исследования? Или это может быть в порядке, в котором я делаю для каждого и если?

<!-- XML -->
<case-studies>

    <case-study>    
        <name>Company A</name>
        <solutionType>Mobility</solutionType>
        <solutionType>Convergence</solutionType>
              <solution category="Business services">Product</solution>     
        <solution category="Business services">Industry</solution>      
        <solution category="#">A-Z</solution>       
        <product>Product 1</product> 
    </case-study>
</case-studies>

Я пытаюсь создать таблицу, в которой чередуются серые строки для каждого элемента. Код ниже возвращает эффект удаления.

Спасибо

    <xsl:sort select="../name" />
    <xsl:if test="@category[. = $solName]">

        <tr>
        <xsl:if test="(position() mod 2 = 1)">
            <xsl:attribute name="bgcolor">#e7e7e7</xsl:attribute>                
        </xsl:if>    

          <td class="cell1">

            <img src="/images/icons/infoWhite.gif" style="margin:3px 3px 0 0px;" id="{../name}" onmouseover="xstooltip_show('{../url}', '{../name}', 0, 10);" onmouseout="xstooltip_hide('{../url}');" />
            <div id="{../url}" class="xstooltip" style="margin:10px 0 0 10px;">
              <div class="floatLeft"><strong>Product(s):</strong></div> 
              <div class="margLeft10 floatLeft">
                <xsl:for-each select="../product/prodName">     
                    <div class="clearRight"><xsl:value-of select="."/></div>
                </xsl:for-each>             
                </div>
            </div> 
          </td> 
          <td class="cell2" style="padding-top:2px;">» <a href="{../url}"><xsl:value-of select="../name"/></a></td>
          <td class="cell3">
            <xsl:for-each select="../solutionType">         
                <div class="clearRight"><xsl:value-of select="."/></div>
            </xsl:for-each>                
          </td>
        </tr>
    </xsl:if>        
</xsl:for-each>

Ответы [ 3 ]

3 голосов
/ 27 мая 2009

Это может работать :

<xsl:for-each select="NewDataSet/authors">
<xsl:sort select="au_lname"/>

<xsl:if test="position()  mod 2 = 1">
<tr bgcolor="#aaccff">
    <td><xsl:value-of select="au_lname"/></td>
    <td><xsl:value-of select="au_fname"/></td>
    <td><xsl:value-of select="phone"/></td>
</tr>
</xsl:if>

<xsl:if test="position()  mod 2 = 0">
<tr bgcolor="#ffccaa">
    <td><xsl:value-of select="au_lname"/></td>
    <td><xsl:value-of select="au_fname"/></td>
    <td><xsl:value-of select="phone"/></td>
</tr>
</xsl:if>

</xsl:for-each>
1 голос
/ 29 мая 2009

Проблема в том, что вам нужно использовать xsl:element, чтобы xsl:attribute работал правильно. Вы не можете установить атрибут статического элемента. Вы должны получить xslt для генерации элемента для вас.

<xsl:sort select="../name" />
  <xsl:if test="@category[. = $solName]">
    <!-- use xsl:element to create an element -->
    <xsl:element name="tr">
      <xsl:if test="position() mod 2 = 1">
        <!-- then xsl:attribute will function as expected -->
        <xsl:attribute name="bgcolor">#e7e7e7</xsl:attribute>
      </xsl:if>

      <!-- snip -->

    </xsl:element>
  </xsl:if>
</xsl:for-each>

Я бы предложил использовать имена классов и css (цвет фона) вместо встроенных стилей:

<xsl:sort select="../name" />
  <xsl:if test="@category[. = $solName]">
    <!-- use xsl:element to create an element -->
    <xsl:element name="tr">
      <xsl:if test="position() mod 2 = 1">
        <!-- then xsl:attribute will function as expected -->
        <xsl:attribute name="class">alternateRow</xsl:attribute>
      </xsl:if>

      <!-- snip -->

    </xsl:element>
  </xsl:if>

Пример CSS (для моего альтернативного решения):

.alternateRow { background-color: #e7e7e7; }

Кроме того, вам не нужно ставить скобки вокруг ваших тестов. Если у меня есть несколько тестов, я заключаю их в круглые скобки для удобства чтения, но только с одним условным парентезом обычно не добавляются.

1 голос
/ 28 мая 2009

Глядя на ваш XSLT, он предлагает вам перебирать элементы «решения» в. Это правильно?

Мне кажется, проблема в том, что при проверке позиции () она будет учитывать все предыдущие элементы решения независимо от того, были ли предыдущие игнорированы условием.

Я могу предложить две возможности для решения этой проблемы.

Во-первых, попробуйте изменить тест для position () на count () для числа соответствующих предыдущих элементов. Например:

<xsl:if test="(count(preceding-sibling::solution[@category=$solName]) mod 2 = 0)">

В качестве альтернативы, вы можете попробовать добавить тест в @category и удалить условие. Например:

<xsl:for-each select="solution[@category = $solName]">
    <xsl:sort select="../name" />
    <tr>
        <xsl:if test="(position() mod 2 = 1)">

Надеюсь, это имеет смысл!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...