XSL处理订单

时间:2012-05-25 21:23:03

标签: 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>

和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> 

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

1 个答案:

答案 0 :(得分:5)

以下是发生的事情:

  1. XSLT处理器读取XML的根元素
  2. 然后它会在样式表中查看匹配的内容。它找到了你的第一个模板
  3. 执行第一个模板。
  4. 第一个模板说输出文本,然后什么都不做,所以XSLT处理器继续移动到下一个输入元素....但是你已经处理了整个根节点,所以没有更多的输入节点在同一水平。已经完成了。
  5. 您需要做的是在第一个模板中加入<xsl:apply-templates/>。当处理器遇到这种情况时,它会重新开始,但这次上下文是根根目录中的第二级节点的列表。它将依次查看每个XML节点,在样式表中找到最匹配的模板,然后执行它。

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