XSL处理订单

Bla*_*ble 3 html xml xslt

我在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>
Run Code Online (Sandbox Code Playgroud)

和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> 
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*son 5

这是正在发生的事情:

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

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

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

  • 其实,是的。该递归调用技术称为“推送”处理,因为您让XSLT处理器将数据“推送”到模板中。这是处理器工作的自然方式,因此设计良好的样式表将被“ apply-templates”“削尖”。另一种方法是在“ for-each”和“ call-template”嵌套的地方使用“拉”式,但是当您欣赏拉式处理的强大功能时,这是非常不自然的。 (2认同)