XSLT position()函数在两步查看中无法正常工作

时间:2017-01-30 17:33:21

标签: html xml xslt poeaa

在尝试实现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>

1 个答案:

答案 0 :(得分:1)

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