Zebra Striped表使用XML和XSLT

时间:2017-01-11 05:50:25

标签: css xml xslt

我查看了StackOverflow网站上的很多帖子,虽然我已经了解了如何进行斑马条纹,但没有帖子展示如何实现它的完整示例。

我只是在学习使用XSLT,所以我确信这是因为我错过了更大的图片。

我的XML表和XSL部分包含在下面。

我已将所有数据与其上方的其他标记相比较,但已包含父标记。

XML

 <chapter>
     <section>
         <table-c>
             <tr> <td>Adept        </td> <td>spell-caster   </td> </tr>
             <tr> <td>Archers      </td> <td>warrior        </td>  </tr>
             <tr> <td>Bard         </td> <td>specialist     </td> </tr>
             <tr> <td>Barbarian    </td> <td>warrior        </td> </tr>
             <tr> <td>Cavalier     </td> <td>warrior        </td> </tr>
             <tr> <td>Cleric       </td> <td>spellcaster    </td> </tr>
             <tr> <td>Druid        </td> <td>spellcaster    </td> </tr>
             <tr> <td>Healer       </td> <td>spellcaster    </td> </tr>
             <tr> <td>Jumper       </td> <td>specialist     </td> </tr>
             <tr> <td>Martialist   </td> <td>warrior        </td> </tr>
             <tr> <td>Necromancer  </td> <td>spell-caster   </td> </tr>
             <tr> <td>Paladin      </td> <td>warrior        </td> </tr>
             <tr> <td>Ranger       </td> <td>warrior        </td> </tr>
             <tr> <td>Rogue        </td> <td>specialist     </td> </tr>
             <tr> <td>Sniper       </td> <td>specialist     </td> </tr>
             <tr> <td>Sorcerer     </td> <td>spellcaster    </td> </tr>
             <tr> <td>Swashbuckler </td> <td>warrior        </td> </tr>
             <tr> <td>Witch        </td> <td>spellcaster    </td> </tr>
             <tr> <td>Wizard       </td> <td>spellcaster    </td> </tr>
          </table-c>
    </section>
 </chapter>

XSL

<xsl:template match="table-c">
<!-- Table is center justified -->

  <table style="margin-left:auto;
        margin-right:auto;
        margin-top:1em;
        margin-bottom:1em;
        ">

<xsl:for-each select="tr">      
  <xsl:if test="position() mod 2 = 1">
    <xsl:attribute name="style">background-color:blue;</xsl:attribute>
      <tr>          
        <xsl:apply-templates/>
      </tr>
 </xsl:if>
</xsl:for-each>

我只是不知道如何在创建属性后实现该属性。(我甚至不确定我是否正确创建它)。

此特定代码会导致xsl解析器因错误而停止。

我的XML文件看起来很好,直到我在for-each标签之间插入这些行。

我无法使用CSS第n个子选项,因为当我这样做时,它会影响xsl文件中的每个其他表设置。我需要能够将不同的样式应用于各种表,所以当我得到条带化工作的方法时,我会将该方法应用于不同的模板。

除非有人知道如何将css样式表方法限制为单个xsl模板。那太棒了,但到目前为止我还没有在互联网上找到任何可以做到的事情。

3 个答案:

答案 0 :(得分:2)

好的,我找到了胜利的答案。

<xsl:template match="table-c">
<!-- Table is center justified -->

  <table style="margin-left:auto;
        margin-right:auto;
        margin-top:1em;
        margin-bottom;1em;
        ">

    <xsl:for-each select="tr">
      <tr>
        <xsl:choose>
          <xsl:when test="position() mod 2 = 1">
            <xsl:attribute name="style">background-color:cyan</xsl:attribute>
          </xsl:when>
          <xsl:otherwise>
            <xsl:attribute name="style">background-color:gray</xsl:attribute>
          </xsl:otherwise>
        </xsl:choose>
       <xsl:apply-templates/>
      </tr>
  </xsl:for-each>

  </table>

</xsl:template>

对于那些刚刚学习XSLT并且需要详细解释正在发生的事情的人来说......好在这里:

我假设您已经知道如何在XSL中应用基本模板。如果没有,那么请访问W3C SCHOOLS网站并了解相关信息。

获得交替颜色行(也就是斑马条纹)的关键是在for-each循环中包含奇数或偶数代码的行/决策。这循环遍历表的每一行,并在循环的每次迭代中决定行位置。 对我来说,突破是发现xsl:choose / xsl:当代码在行内部找出它所在的行时。注意这是结束前的最后一行,也就是结束之后。 在选择代码找出它所在的行并根据其设置样式之后,然后将该样式应用于行。 然后,for-each循环移动到下一行,并且select / when代码重新开始,以找出它所在的行。

虽然我的示例很简单,但您不会看到我的xsl文件有多个表格模板,我可以使用此代码并将所有样式的庄园应用于其他各种表格模板。

由于某些原因,XSL的创建者不包含if / then或if / else-if / else及其xsl:if。如果你想要那种类型的功能,那么你必须使用那种疯狂的选择/当它们出现时。

答案 1 :(得分:0)

尝试使用CSS,如:

tr:nth-child(even) {  background: #ccc  }
tr:nth-child(odd) {  background: #fff  }

更新:抱歉,错过了,也许试试:

<xsl:for-each select="chapter/section/table-c/tr">      
  <xsl:if test="(position() mod 2) != 1">
    <xsl:attribute style="background-color:blue">make_blue</xsl:attribute>
      <tr style="make_blue">            
        <xsl:apply-templates/>
      </tr>
 </xsl:if>
<xsl:for-each>

代码来自here

答案 2 :(得分:0)

您的方法基本上是正确的,只是<xsl:if>的位置是错误的。您需要将该属性应用于您在输出中生成的每秒<tr>,因此<xsl:if>和属于它的<xsl:attribute>必须放在<tr>之下输出元素:

<xsl:for-each select="tr">      
  <tr>          
    <xsl:if test="position() mod 2 = 1">
        <xsl:attribute name="style">background-color:blue;</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates/>
  </tr>
</xsl:for-each>

如果你有

<xsl:for-each select="tr">
    <xsl:if test="position() mod 2 = 1">
        <tr>
    ...
        </tr>
    </xsl:if>
<xsl:for-each>

您在原始<tr>元素上获得了一种过滤函数:源文档中只有每秒<tr>将被处理并放入结果文档中。这显然不是你想要的。您需要将每个源<tr>放入结果文档中,并为每秒<tr>添加一个属性。这就是为什么你必须将<xsl:if>移到<tr>以下。