我有这个工作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> </xsl:text>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
&#13;
输入样本xml就是这个
<?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;
答案 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>