代码之家  ›  专栏  ›  技术社区  ›  chernevik

解释XSLT处理路径的资源

  •  2
  • chernevik  · 技术社区  · 15 年前

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

    this 看起来它们应该相对容易回答,而且经过一些研究后肯定是这样。我几乎不好意思把它们贴出来。但是我已经看过Kay的XSLT程序员参考资料、XSLT食谱和学习XSLT,仍然找不到一个节点及其子节点如何通过一组规则处理的清晰解释。也许我是个白痴,但我还没有发现Python、Linux、Apache、MySQL或bash像XSLT那样让人沮丧。

    更新谢谢你的回答。我有几天不能再拿这个了,但是我非常感谢你的帮助。

    3 回复  |  直到 7 年前
        1
  •  4
  •   lavinio    15 年前

    本节将在规范中介绍 XSLT Template Rules

    不要将XSLT视为作用于XML。

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

    这有用吗?

        2
  •  3
  •   Nic Gibson    15 年前

    模板处理由XSLT引擎本身驱动,而不是(通常)由代码驱动。这样,它与您提到的过程语言非常不同。如果你有函数式编程方面的背景,那将非常有帮助。

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

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

    现在,在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>
    

    上面的应用模板将重新启动遍历(顺便说一句,不带select属性的应用模板与使用相同) 选择

    我希望这有帮助。在这种情况下,图表是最好的方法。

        3
  •  1
  •   Mads Hansen    15 年前

    如果您有一些钱可以花在培训上,Ken Holman有一套出色的XML/XSLT/XPATH/XSL-FO培训课程。

    http://www.cranesoftwrights.com/training/ptux/ptux-video.htm

    XSLT需要以不同的方式看待事物。许多程序员很难调整或理解XSLT,因为他们总是从过程代码的角度来思考问题,而不是以更实用的方式来思考问题。