关于 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>
关于这个问题有两个问题:
那么,“稍后”的模板是受制于“早期”模板中发生的事情,还是它们对源文档进行操作,而忘记了在它们之前已经转换了什么?(所有这些词都用了引号,因为我发现很难讨论基于时间的问题,当我真的不知道如何确定模板顺序摆在首位...)
在上面的示例中,我们有一个与根节点(“/”)匹配的模板,当它完成执行时,实际上已经从输出中删除了所有节点。如果是这样的话,这是否会阻止所有其他模板的执行,因为在第一个模板完成之后就没有匹配了?
到目前为止,我一直担心后面的模板不会执行,因为它们操作的节点不会出现在输出中,但是反过来呢?“早期”模板能否创建一个“晚期”模板可以使用的节点?
对于上述相同的 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会因为“ fullName”节点在我们到达模板 # 2的时候已经存在于输出中而执行吗?
我意识到我对 XSLT 的“禅”一无所知。到目前为止,我的样式表已经包含了一个与根节点匹配的模板,然后完全是过程性的。我受够了。我更愿意正确地理解 XSLT,因此我提出了这个问题。