XSLT-XSLT处理器如何匹配模板

时间:2018-10-30 15:32:49

标签: xml xslt

我试图了解XSLT 1.0的基本概念。我正在使用Firefox浏览器进行学习。以下示例无论如何都不实际,而是说明了我的问题的基础。

对于源XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="helloworld.xsl"?>

<messages>
    <greeting>Hello World!</greeting>
    <farewell>Bye World!</farewell>
</messages>

和样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" version="4.0" encoding="UTF-8" />

        <xsl:template match="greeting">
            <b><xsl:value-of select="." /></b>
        </xsl:template>

        <xsl:template match="farewell">
            <b><xsl:value-of select="." /></b>
        </xsl:template>

</xsl:stylesheet>

我收到“你好!”和“再见世界!”变粗体。如果我使用以下样式表:

   <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="html" version="4.0" encoding="UTF-8" />

            <xsl:template match="greeting">
                <b><xsl:value-of select="." /></b>
            </xsl:template>

            <xsl:template match="greeting">
                <i><xsl:value-of select="." /></i>
            </xsl:template>

    </xsl:stylesheet>

然后“再见世界!”预期的不是粗体,但“ Hello World”也不是粗体,只有斜体。发生了什么?在样式表的第一个版本中,似乎两个模板都在执行-都与文档节点匹配。在第二个版本中,似乎只有第二个被执行,或者它的输出覆盖了第一个。非常感谢您解释XSLT处理器将两个样式表中的节点与模板匹配的依据。

据我了解:在转换开始时,将选择文档节点作为上下文。 XSLT处理器遍历上下文中的节点,并尝试查找每个节点的模板以进行匹配和执行。上下文是“当前节点”的同义词。我不明白的是:处理器是通过作为当前节点的子节点的节点(因此,在我的示例中为消息节点,因为它是文档节点的唯一子节点)还是通过所有节点作为当前节点的后代进行迭代?

1 个答案:

答案 0 :(得分:1)

要了解发生了什么,您应该查看XSL转换后产生的HTML代码-而不是该代码在屏幕上的呈现方式。您会得到:

<i>Hello World!</i>
Bye World!

第一行由匹配greeting *的(最后)模板产生。第二行由built-in template rules产生,该specification在缺少匹配模板的情况下处理farewell元素。这些模板会将所有文本节点复制到输出中。


(*)具有两个冲突的模板是错误的。但是,security zones允许处理器忽略该错误,并在XSLT文档中应用最后一个匹配的模板。