在尝试实现Martin Fowler所描述的模式“Two Step View”时,我遇到了一些问题,使得HTML表的交替行着色起作用。这使用XSLT position()
函数。您可以在下面看到table/row
的XSLT模板。但是,在输出中,bgcolor
元素的tr
属性始终为"linen"
,表示position()
的值在我们迭代{{1}时不会发生变化元素。为什么会这样?
table/row
输入XML:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="screen">
<html>
<body bgcolor="white">
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="title">
<h1>
<xsl:apply-templates/>
</h1>
</xsl:template>
<xsl:template match="field">
<p><b><xsl:value-of select="@label"/>: </b><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="table">
<table><xsl:apply-templates/></table>
</xsl:template>
<xsl:template match="table/row">
<xsl:variable name="bgcolor">
<xsl:choose>
<xsl:when test="(position() mod 2) = 0">linen</xsl:when>
<xsl:otherwise>white</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<tr bgcolor="{$bgcolor}"><xsl:apply-templates/></tr>
</xsl:template>
<xsl:template match="table/row/cell">
<td><xsl:apply-templates/></td>
</xsl:template>
</xsl:stylesheet>
输出HTML:
<?xml version="1.0"?>
<screen>
<title>Dissociation</title>
<field label="Artist">Dillinger Escape Plan</field>
<table>
<row>
<cell>Limerent Death</cell>
<cell>4:06</cell>
</row>
<row>
<cell>Symptom Of Terminal Illness</cell>
<cell>4:03</cell>
</row>
<row>
<cell>Wanting Not So Much To As To</cell>
<cell>5:23</cell>
</row>
</table>
</screen>
答案 0 :(得分:1)
将<table><xsl:apply-templates/></table>
更改为<table><xsl:apply-templates select="row"/></table>
或使用<xsl:strip-space elements="*"/>
或至少<xsl:strip-space elements="table"/>
。目前,您正在处理所有子节点,包括空格文本节点,这与您使用position()
的尝试失败有关。