如何使用XSLT设置表格行的样式

时间:2016-06-21 22:07:54

标签: html xml xslt

我有这个工作xslt但有问题在表行显示替代颜色。由于在父标记完成后递归生效,行颜色即将到来,但不是替代行

你可以帮我吗



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>
<xsl:template match="/">
   <html>
   <body>
   <table border="1">
    <xsl:apply-templates select="*"/>
   </table>
   </body>
   </html>
</xsl:template>

<xsl:template match="*[text()]">

  <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:for-each select="ancestor-or-self::*">
        <xsl:value-of select="name()" />
        <xsl:if test="position()!=last()">
            <xsl:text>_</xsl:text>
        </xsl:if>
    </xsl:for-each>
    </td>
    <td>
    <xsl:value-of select="." />
    </td>
  </tr>
    <xsl:text>&#10;</xsl:text>
    <xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
&#13;
&#13;
&#13;

输入样本xml就是这个

&#13;
&#13;
<?xml-stylesheet type="text/xsl" href="xmltohtmlrecurnewfromAns.xsl"?>
<A>
   <B>Text</B>
   <C>Text</C>
   <D>
      <D1>Text</D1>
      <D2>
          <D3>Text</D3>
          <D4>Text</D4>
      </D2>
   </D>
   <E>
      <E1>
          <E2>
              <E3>Text</E3>
          </E2> 
      </E1>
   </E>
</A>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

不是通过使用<xsl:apply-templates select="*"/>递归执行,而是只需在一个选择中选择所有“叶子”元素。

<xsl:apply-templates select="//*[text()]"/>

这样,检查位置的逻辑将按预期工作。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:strip-space elements="*"/>
<xsl:template match="/">
   <html>
   <body>
   <table border="1">
     <xsl:apply-templates select="//*[text()]"/>
   </table>
   </body>
   </html>
</xsl:template>

<xsl:template match="*">
  <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:for-each select="ancestor-or-self::*">
        <xsl:value-of select="name()" />
        <xsl:if test="position()!=last()">
            <xsl:text>_</xsl:text>
        </xsl:if>
    </xsl:for-each>
    </td>
    <td>
    <xsl:value-of select="." />
    </td>
  </tr>
</xsl:template>
</xsl:stylesheet>