【问题标题】:Problem with XSL 1.0 <xsl:for-each> and <call-template>XSL 1.0 <xsl:for-each> 和 <call-template> 的问题
【发布时间】:2009-06-11 17:55:31
【问题描述】:

请查看我的代码并就此提出建议:

XML 文件:content.xml

<content>
<page id="page-1">
<!-- ... -->
<block-center>
  <block-center-row id="block-center-row-1">
    <cd>
      <title>Empire Burlesque</title>
      <artist>Bob Dylan</artist>
      <country>USA</country>
      <company>Columbia</company>
      <price>10.90</price>
      <year>1985</year>
    </cd>
    <cd>
      <title>Hide your heart</title>
      <artist>Bonnie Tyler</artist>
      <country>UK</country>
      <company>CBS Records</company>
      <price>9.90</price>
      <year>1988</year>
    </cd>
  </block-center-row>
  <block-center-row id="block-center-row-2">
    <block-center-colunm id="block-center-2-1">
      <book>
        <title>Book Title1</title>
        <author>Book Author1</author>
      </book>
      <book>
        <title>Book Title2</title>
        <author>Book Author2</author>
      </book>
      <book>
        <title>Book Title3</title>
        <author>Book Author3</author>
      </book>
    </block-center-colunm>
    <block-center-colunm id="block-center-2-2">
      <seminar>
        <author>Seminar author1</author>
        <durable>3</durable>
      </seminar>
      <seminar>
        <author>Seminar author2</author>
        <durable>1.5</durable>
      </seminar>
      <seminar>
        <author>Seminar author3</author>
        <durable>2</durable>
      </seminar>
      <seminar>
        <author>Seminar author4</author>
        <durable>3</durable>
      </seminar>
    </block-center-colunm>
  </block-center-row>
</block-center>
</page>
<!-- ... -->
</content>

XSL 文件:block-center-1-1.xsl

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template name="block-center-row-1">
    <div class="block-center-row">
      <h2>My CD Collection</h2>
      <table border="1" width="100%">
        <tr bgcolor="#9acd32">
          <th>Title</th>
          <th>Artist</th>
        </tr>
        <xsl:for-each select="
          content/page[@id=$pageId]/block-center/
          block-center-row[@id='block-center-row-1']/cd
        ">
          <tr>
            <td>
              <xsl:value-of select="title" />
            </td>
            <xsl:choose>
              <xsl:when test="price &gt; 10">
                <td bgcolor="#ff00ff">
                  <xsl:value-of select="artist" />
                </td>
              </xsl:when>
              <xsl:when test="price &gt; 9">
                <td bgcolor="#cccccc">
                  <xsl:value-of select="artist" />
                </td>
              </xsl:when>
              <xsl:otherwise>
                <td>
                  <xsl:value-of select="artist" />
                </td>
              </xsl:otherwise>
            </xsl:choose>
          </tr>
        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>

XSL 文件block-center.xsl:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="block-center-1-1.xsl" />
  <xsl:template name="block-center">
    <!-- if put here. It work properly -->
    <div class="block-center"> 
      <xsl:for-each select="content/page[@id=$pageId]/block-center/block-center-row">
        <xsl:choose>
          <!-- // I does not work here --> 
          <xsl:when test="@id='block-center-row-1'">
            <xsl:call-template name="block-center-row-1" />
          </xsl:when>
        </xsl:choose>
      </xsl:for-each>
    </div>
  </xsl:template>
</xsl:stylesheet>

如果我在 &lt;xsl:for-each&gt; 循环中调用 &lt;xsl:call-template&gt;,我不知道为什么它不起作用(不输出数据)。否则,没关系。

【问题讨论】:

  • 从您给我们的信息来看,这永远不会奏效——根本没有匹配的模板。您需要提供更完整的代码。
  • 奇怪...右下角写着“6个修订版”,但实际上只有3个修订版。

标签: xslt


【解决方案1】:

我有几句话要说。首先,在 XML 中包含格式含义是个坏主意。拥有名为 &lt;block-center&gt;&lt;block-center-colunm&gt; 的元素不仅不必要地冗长,而且一旦它们的内容不再显示在中心的块中,它也会让你头疼。

其次,放开&lt;xsl:call-template&gt;&lt;xsl:for-each&gt;。如果您具有过程编程背景,它们可能看起来很方便,但它们是错误的选择。改用&lt;xsl:apply-templates&gt;,这样代码会更干净、更容易理解。

现在转到您的 XSL。您的第二个 XSL (block-center.xsl) - 它有什么作用?为什么有两个单独的 XSL 文件?此外,它缺少变量或参数声明。我用过:

<xsl:variable name="pageId" select="'page-1'" />

我的测试。它也只有一个模板 (&lt;xsl:template name="block-center"&gt;) 从未真正被调用过,所以它没有为我做任何事情。我添加了

<xsl:template match="/">
  <xsl:call-template name="block-center" />
</xsl:template>

所以它至少可以做任何事情。

您的其他 XSL 文件 (block-center-1-1.xsl) 有一个未查看正确上下文的 for-each 循环。输入模板"block-center-row-1"时,您已经处于以下上下文中:

content/page[@id=$pageId]/block-center/block-center-row

所以你在 for-each 循环中需要做的就是:

<xsl:for-each select="cd">

它将开始输出所有&lt;cd&gt;节点。

【讨论】:

    【解决方案2】:

    非常感谢您的热情! 如果我更改 block-center-1-1.xsl 文件,它现在可以正常工作 至

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多