首页 > 解决方案 > xsl:apply-templates 正确放置

问题描述

我正在尝试修改现有的 XSLT 以使其适合我的需要,但想了解 xsl:apply-templates 的正确应用程序以处理其他标签。

鉴于以下现有代码。我想首先了解一些事情。

  1. <xsl:apply-templates/>没有选择语句。因此,从文档中可以看出,该元素将模板应用于当前元素或当前元素的子节点。那么这是否意味着对于与 tabelcell 的匹配,那么这个模板只会应用于它自己(并且只有当有 select 语句来处理这些孩子时才会应用于孩子)?

  2. 如果示例代码中的放置在结束</td>标记之后而不是内部,是否会有所不同?

  3. 如果下面的示例代码没有该行<xsl:apply-templates/>,那么这是否意味着与 tabelcell 的匹配不会发生任何事情?

    <xsl:template match="tablecell"> <td valign="top"> Removed content for simplicity <xsl:apply-templates/> </td> </xsl:template>

  4. 如果有<tabelcell>类似的孩子,<par>或者<pardef> 考虑到它已经包含<xsl:apply-templates/><td>元素中,我将如何修改上述代码以合并此类处理?例如,如果我想添加<xsl:apply-templates select="par" />

我只是 XSLT 的新手,到目前为止,我一直只是在 xsl:template 标记中放置带有 select 语句的 xsl:apply-templates 元素。

如果有人可以通过回答我上面的问题来帮助澄清我对 xsl:apply-templates 的行为和使用的理解,那就太棒了。

干杯,

标签: xmlxslt

解决方案


  1. 因此,从文档中可以看出,该元素将模板应用于当前元素或当前元素的子节点。

    我不知道你在哪里读到这个。这不是真的。以下是 规格说明:

    在没有选择属性的情况下,xsl:apply-templates指令处理当前节点的所有子节点,包括文本节点。

  2. 是的,它有所作为。按照您现在的方式,应用模板的结果将放置在元素内td。如果您将xsl:apply-templates指令移到td元素之外,那么结果将最终出现在输出中。

  3. 不会。该td元素仍将被创建。它只是空的(或者更准确地说,它仍然包含“为简单起见删除的内容”部分中的任何内容)。

  4. 这个问题不清楚。正如上面#1 中所解释的,所有的孩子都tablecell将被处理。如果您添加另一条指令<xsl:apply-templates select="par" />,则par元素将被处理两次


推荐阅读