资源解释XSLT处理路径

时间:2009-06-18 01:02:33

标签: xslt

了解XSLT应用模板规则的原则的最佳资源是什么?

this这样的问题似乎应该相对容易回答,而且经过一些研究后肯定会这样。我几乎不好意思发布它们。但是我看过Kay的XSLT程序员参考,XSLT Cookbook和Learning XSLT,我仍然无法找到一个节点及其子节点如何被一组规则处理的清晰解释。也许我是个白痴,但我没有发现Python,Linux,Apache,MySQL或者bash就像XSLT那样纯粹的挫败感。

更新感谢您的回答。几天后我再也无法接受这个了,但我很感激你的帮助。

3 个答案:

答案 0 :(得分:4)

XSLT Template Rules规范中的这一部分非常简单,并举例说明。

不要认为XSLT会对您的XML起作用。

将您的XML视为流经XSLT。

XSLT从根模板开始,假想光标位于文档树的根级别:

<xsl:template match="/">
    ...stuff in here...
</xsl:template>

在中间,XSLT将开始执行语句。如果您有<xsl:apply-templates select="...something..."/>,那么它会在光标处找到与select =中的XPath匹配的所有内容,并查找带有<xsl:template match="...something...">的模板。它找到的第一个,根据优先规则,它将执行。

执行该新模板时,同样适用,但上下文现在是匹配的节点。

这些是基础知识。例如,如果你有这个XSLT程序,那么无论输入是什么,你都会得到<hello world="!"/>作为输出:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <hello world="!"/>
    </xsl:template>
</xsl:stylesheet>

但如果你有这样的输入:

<people>
    <name>Paige</name>
    <name>Hayley</name>
    <name>Hamlet</name>
</people>

并将其用作转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <xsl:apply-templates select="/people/name[substring(., 1, 1) = 'H']"/>
                </table>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="name">
        <tr>
            <td>
                <xsl:value-of select="."/>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

首先会设置一个HTML文件。然后,它将在根元素下的'people'元素下找到所有'name'元素,如果它们以字母'H'开头,则将搜索模板匹配'name'。由于我们有一个,它将写出一个带有名称的表行。它将执行该规则两次,然后关闭HTML元素,脚本将结束。

这有帮助吗?

答案 1 :(得分:3)

上面的答案很好地解释了如果你定义了模板会发生什么,但是理解XSLT的内置行为也非常重要。

模板处理由XSLT引擎驱动,而不是(通常)由您的代码驱动。这样,它与你提到的程序语言非常不同。如果你有任何功能编程方面的背景,那将会有很大的帮助。

XSLT的初始行为是匹配文档节点。文档节点是一个“虚构”节点,充当xml文档根节点的父节点。它代表整个文件。内置行为实际上是xsl:apply-templates,如下所示:

<xsl:apply-templates select='/|*'/>

xpath语句匹配documentnode或任何其他元素。它匹配根节点,然后遍历您的文档。将文档视为树。在每个元素节点,它将执行完全相同的语句。 XSLT以从左到右的顺序遍历节点(因此,如果您的根元素有两个子节点,它将在第二个节点之前触及文档中的第一个节点)。由于它正在执行上面的选择,它将进入该节点的子节点并执行相同的操作。这是树的深度优先从左到右的遍历。

现在,在XSLT引擎命中的每个元素节点上,它将查找匹配的模板。规则相对简单 - 它将选择执行最具体的模板。内置模板始终是最不具体的。匹配完整路径的模板非常具体:

<xsl:template match='/some/path/to/a/node'>...</xsl:template>.

仅匹配节点名称的模板不太具体:

<xsl:template match='node'>...</xsl:template>

如果您定义了引擎选择的模板(您定义的任何模板将优先于内置使用),则上面的默认遍历将停止。它会执行您的模板并停止,除非您的模板再次开始遍历:

<xsl:template match='node'>
    <p><xsl:value-of select='@text'/></p>
    <xsl:apply-templates/>
</xsl:template>

上面的apply-templates重新启动我们的遍历(顺便说一下,没有select属性的apply-templates与使用 select =''*。

相同。

我希望有所帮助。这是图表是最佳方法的情况之一。

答案 2 :(得分:1)

如果您有足够的资金用于培训,Ken Holman拥有一套优秀的XML / XSLT / XPATH / XSL-FO培训课程。

http://www.cranesoftwrights.com/training/ptux/ptux-video.htm他链接到一些示例视频。

我亲自参加了他的培训课程。他非常详尽,并解释了XML / XSLT / XPATH的处理模型,功能和方面。了解如何处理节点树以及XSLT引擎如何“遍历树”非常重要。那么XSLT模板以及“推”和“拉”之间的区别确实很有意义。

XSLT需要一种不同的方式来查看事物。许多程序员很难调整或理解XSLT,因为他们一直在考虑程序代码而不是更具功能性的方式。