【问题标题】:XSLT template matching issueXSLT 模板匹配问题
【发布时间】:2009-12-31 07:50:54
【问题描述】:

我对 XSLT 应用模板语句感到困惑。例如,在 w3school 中。

http://www.w3schools.com/xsl/xsl_apply_templates.asp

提到-“<xsl:apply-templates> 元素将模板应用于当前元素或当前元素的子节点。”,我的问题是它是应用于当前元素还是子节点或两者兼而有之? “或”这个词让我对它的明确行为感到困惑。

编辑 1:这里是代码 sn-p 我很困惑,当 xslt 处理器找到<xsl:apply-templates/> 时,我很困惑,它将匹配“当前节点”的所有子节点。这里的“当前节点”是指目录还是另一个虚拟抽象 XML 根节点?为什么?

<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <xsl:apply-templates/>
  </body>
  </html>
</xsl:template>

提前致谢, 乔治

【问题讨论】:

    标签: html xslt


    【解决方案1】:

    w3schools 文档并不像人们想象的那样,我同意,在这种情况下它具有很大的误导性。

    规范说:

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

    XML 中的“子项”始终表示直接子项。孩子的孩子等被称为“后裔”。

    “当前节点”就是这个意思。它由 apply-templates 指令出现的上下文决定。

    所以最初你可能有:

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>
    

    这里的当前节点是文档节点,apply-templates 将作用于它的子节点,即 XML 的顶级元素。

    在此示例中:

    <xsl:template match="cd">
      <xsl:apply-templates />
    </xsl:template>
    

    当前节点将是 XML 中某个名为“cd”的节点,并且应用模板将作用于该节点的直接子节点。

    请注意,这不一定适用于名为“cd”的每个元素,实际上也不需要适用于名为“cd”的任何元素,这取决于如何XSLT 中的其他模板处理输入 XML。它只是说,只要该模板 匹配,当前节点将是一个“cd”节点。

    【讨论】:

    • 感谢您的帮助,我在帖子的 EDIT1 部分更新了我进一步的困惑,还有更多的 cmets 吗?
    • 在您的示例中,当前节点是文档节点。它既不是虚拟的,也不是抽象的。它是 DOM 的最顶层节点,也是目录元素的父节点。因此,apply-templates 指令将只选择唯一的“目录”元素。
    【解决方案2】:

    如果您想将模板应用于当前元素,请使用:

    <xsl:apply-templates select="."/>
    

    【讨论】:

    • 感谢您的帮助,我在帖子的 EDIT1 部分更新了我进一步的困惑,还有更多的 cmets 吗?
    【解决方案3】:

    &lt;xsl:apply-templates/&gt;匹配当前节点的所有子节点。

    在例如

    <xsl:template match="/">
      <html>
      <body>
      <h2>My CD Collection</h2>  
      <xsl:apply-templates/>  
      </body>
      </html>
    </xsl:template>
    

    当前节点(/)是目录(根节点)。因此,将应用与所有子节点(cd、标题、艺术家、国家/地区...)匹配的模板(如果存在)。

    您理解的最佳方法是更改​​示例中的 xslt 并观察您获得的各种输出。

    一种方法是删除所有其他 3 个模板(cd、艺术家和标题)并再次运行 xslt。

    【讨论】:

    • 感谢您的帮助,我在帖子的 EDIT1 部分更新了我进一步的困惑,还有更多的 cmets 吗?
    【解决方案4】:

    我的问题是它是否适用 到当前元素或子节点 还是两者都有?

    这取决于apply-templates元素中是否有select属性。

    如果只是&lt;xsl:apply-templates/&gt;,那么匹配当前元素的子节点的模板将被应用。在 w3Schools 的案例中,这意味着 cd、标题和艺术家都被应用了。

    但是,如果您要执行 &lt;xsl:apply-templates select="/catalog/cd/artist"/&gt; 之类的操作,则只有该元素会应用模板。

    【讨论】:

    • 感谢您的帮助,我在帖子的 EDIT1 部分更新了我进一步的困惑,还有更多的 cmets 吗?
    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多