我查看了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模板。那太棒了,但到目前为止我还没有在互联网上找到任何可以做到的事情。
答案 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>
以下。