这总是让我对XSLT感到困惑:
- 模板以什么顺序执行,以及
- 当它们执行时,它们在(a)原始源XML或(b)到该点的XSLT当前输出上是否匹配?
例:
<person>
<firstName>Deane</firstName>
<lastName>Barker</lastName>
</person>
这是XSLT的片段:
<!-- Template #1 -->
<xsl:template match="/">
<xsl:value-of select="firstName"/> <xsl:value-of select="lastName"/>
</xsl:template>
<!-- Template #2 -->
<xsl:template match="/person/firstName">
First Name: <xsl:value-of select="firstName"/>
</xsl:template>
关于此的两个问题:
- 我假设模板#1将首先执行。我不知道为什么要这么做-仅仅是因为它首先出现在文档中吗?
- 模板2将执行吗?它与源XML中的一个节点匹配,但是当我们到达此模板时(假设它第二次运行),“ firstName”节点将不在输出树中。
那么,“较新的”模板是否会像“较早的”模板中发生的一样,还是它们在源文档上操作,而忽略了已转换为“更早”的模板呢?(所有这些词都用引号引起来,因为当我真的不知道如何首先确定模板顺序时,我很难讨论基于时间的问题。)
在上面的示例中,我们有一个模板在根节点(“ /”)上匹配,该模板在完成执行后实际上已从输出中删除了所有节点。在这种情况下,由于第一个模板完成后没有匹配的内容,这会阻止其他所有模板执行吗?
至此,我一直在担心以后的模板不执行,因为它们所操作的节点未出现在输出中,但是相反呢?“较早的”模板可以创建一个节点,“较晚的”模板可以执行此操作吗?
在与上述相同的XML上,考虑以下XSL:
<!-- Template #1 -->
<xsl:template match="/">
<fullName>
<xsl:value-of select="firstName"/> <xsl:value-of select="lastName"/>
</fullName>
</xsl:template>
<!-- Template #2 -->
<xsl:template match="//fullName">
Full Name: <xsl:value-of select="."/>
</xsl:template>
模板#1创建一个名为“ fullName”的新节点。模板#2在同一节点上匹配。模板2将执行,因为到模板2时输出中已经存在“ fullName”节点吗?
我意识到我对XSLT的“禅宗”一无所知。到目前为止,我的样式表由与根节点匹配的模板组成,然后从那里开始是完全过程性的。我厌倦了这样做。我宁愿实际上正确地理解XSLT,因此是我的问题。