3

我很难在 SO 或其他地方找到一个准确而简单的答案:

在 XSL 文件中,您如何知道哪个模板将首先被处理,第二个,等等?我读到它是按 XPath 的具体程度排序的。此外,XSL 1.0 与 2.0 有区别吗?

最后,这是一个我正在玩弄的有缺陷的 XSL 文件。目前输出只是标题“目录”。我也会在此处附上 XML。

<xsl:template match="/">
    <h1>
        <xsl:text>Table of Contents</xsl:text>
    </h1>
</xsl:template>

<xsl:template match="heading1">
    <h2>
        <xsl:value-of select="."/>
    </h2>
</xsl:template>

<p>
    <xsl:text>This document contains </xsl:text>
    <xsl:value-of select="count(/article/body/heading1)"/>
    <xsl:text> chapters. </xsl:text>
</p>

和 XML:

<article>
<title>
    Creating output
</title>
<body>
    <heading1>Generating text</heading1>
    <heading1>Numbering things</heading1>
    <heading1>Formatting numbers</heading1>
    <heading1>Copying nodes from the input document to the output</heading1>
    <heading1>Handling whitespace</heading1>
</body> 

关于为什么没有显示所有内容的任何解释?谢谢您的帮助!

4

1 回答 1

5

这是正在发生的事情:

  1. XSLT 处理器读取 XML 的根元素
  2. 然后它在样式表中查看匹配的内容。它会找到您的第一个模板
  3. 它执行第一个模板。
  4. 第一个模板说要输出文本,然后什么也不做,所以 XSLT 处理器继续处理下一个输入元素....但是您已经处理了整个根节点,因此没有更多的输入节点在同一等级。完成。

您需要做的是<xsl:apply-templates/>在第一个模板中放置一个。当处理器遇到这种情况时,它会重新开始,但这次上下文是根内的二级节点列表。它将依次查看每个 XML 节点,在您的样式表中找到最匹配的模板,然后执行它。

这是一个关键概念——模板不受控制,也不是程序化的。

于 2012-05-25T21:29:17.920 回答