XSLT position() 函数在两步视图中无法按预期工作

XSLT position() function not working as expected in Two Step View

在尝试实现 Martin Fowler 描述的模式 "Two Step View" 时,我在 HTML table 的交替行着色工作时遇到了一些问题。这使用 XSLT position() 函数。您可以在下面看到 table/row 的 XSLT 模板。但是,在输出中,tr 元素的 bgcolor 属性始终为 "linen",表明 position() 的值在我们遍历 [=14= 时没有改变] 元素。为什么会这样?

<?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>

输入XML:

<?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>

输出HTML:

<html><body bgcolor="white">
  <h1>Dissociation</h1>
  <p><b>Artist: </b>Dillinger Escape Plan</p>
  <table>
    <tr bgcolor="linen">
      <td>Limerent Death</td>
      <td>4:06</td>
    </tr>
    <tr bgcolor="linen">
      <td>Symptom Of Terminal Illness</td>
      <td>4:03</td>
    </tr>
    <tr bgcolor="linen">
      <td>Wanting Not So Much To As To</td>
      <td>5:23</td>
    </tr>
  </table>
</body></html>

<table><xsl:apply-templates/></table> 更改为 <table><xsl:apply-templates select="row"/></table> 或使用 <xsl:strip-space elements="*"/> 或至少 <xsl:strip-space elements="table"/>。目前您正在处理所有子节点,包括白色 space 文本节点,这样您使用 position() 的尝试就会失败。