Альтернативный цвет строки таблицы с использованием XSLT - PullRequest
2 голосов
/ 16 ноября 2011

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

<table>
<tr>
    <td>Name</td>
    <td>ID</td>
</tr>
<xsl:for-each select="//Book">
    <xsl:variable name="altColor">
        <xsl:choose>
            <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
            <xsl:otherwise>#D3DFEE</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <tr bgcolor="{$altColor}">
        <td><xsl:value-of select="current()/@name"/></td>
        <td><xsl:value-of select="current()/@ID"/></td>
    </tr>
</xsl:for-each>
</table>

, который работает нормально, однако, у меня есть несколько случаев, когда мне нужно включить некоторые операторы if в for-each, например.

<table>
<tr>
    <td>Name</td>
    <td>ID</td>
</tr>
<xsl:for-each select="//Book">
    <xsl:variable name="altColor">
        <xsl:choose>
            <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
            <xsl:otherwise>#D3DFEE</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:if test="current()/@ID &gt; 10000 and current/@ID &lt; 6000">
        <tr bgcolor="{$altColor}">
            <td><xsl:value-of select="current()/@name"/></td>
            <td><xsl:value-of select="current()/@ID"/></td>
        </tr>
    </xsl:if>
</xsl:for-each>
</table>

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

Я попытался добавить xsl: sort, который на самом деле не решает проблему. Есть ли способ избежать этой загадки?

Ответы [ 3 ]

1 голос
/ 23 апреля 2015

Попробуйте ввести следующий код:

tr[position() mod 2 =0]

<xsl:template match="n1:tr[position() mod 2 =0]">
 
   <tr bgcolor="#aaaaaa">
 
     <xsl:apply-templates/>

    </tr> 
  </xsl:template>
  


  <xsl:template match="n1:tr[position() mod 2 =1]">

    <tr bgcolor="#aaaaff">

      <xsl:apply-templates/>

    </tr>

  </xsl:template>
0 голосов
/ 16 ноября 2011

Самое простое решение (принимая вашу примерную таблицу стилей в качестве примера ваших реальных потребностей) - это в первую очередь только циклы по нужным узлам.Например:

<xsl:template match="/">
    <table>
        <tr>
            <td>Name</td>
            <td>ID</td>
        </tr>
        <xsl:for-each select="//Book[@ID &lt; 10000 and @ID &gt; 6000]">
            <xsl:variable name="altColor">
                <xsl:choose>
                    <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
                    <xsl:otherwise>#D3DFEE</xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
        <tr bgcolor="{$altColor}">
            <td><xsl:value-of select="@name" /></td>
            <td><xsl:value-of select="@ID" /></td>
        </tr>
        </xsl:for-each>
    </table>
</xsl:template>

Другими словами, вместо условного включения узлов в тело for-each просто выберите только те узлы, которые вам нужны.Таким образом, position() будет относиться к набору, который вы итерируете, и будет работать как положено.

Например, этот (упрощенный) ввод:

<r>
    <Book ID="6200"/>
    <Book ID="7100"/>
    <Book/>
    <Book/>
    <Book ID="8000"/>
    <Book/>
    <Book ID="9001"/>
    <Book ID="9002"/>
</r>

Производитправильное чередование:

<table>
    <tr>
        <td>Name</td>
        <td>ID</td>
    </tr>
    <tr bgcolor="#D3DFEE">
        <td />
        <td>6200</td>
    </tr>
    <tr bgcolor="#FFFFFF">
        <td />
        <td>7100</td>
    </tr>
    <tr bgcolor="#D3DFEE">
        <td />
        <td>8000</td>
    </tr>
    <tr bgcolor="#FFFFFF">
        <td />
        <td>9001</td>
    </tr>
    <tr bgcolor="#D3DFEE">
        <td />
        <td>9002</td>
    </tr>
</table>
0 голосов
/ 16 ноября 2011

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

вот псевдокод

currentColor = color1
for each 
if ( id > 10000 and id < 6000 ) {
  if ( currentColor == color1 )
      currentColor= color2
  else 
      currentColor = color1
  showDataInColor(currentColor)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...