【问题标题】:XSLT - how does XSLT processor match templatesXSLT - XSLT 处理器如何匹配模板
【发布时间】:2018-10-30 15:32:49
【问题描述】:

我试图了解 XSLT 1.0 的工作原理。我正在使用火狐浏览器进行学习。以下示例在任何方面都不实用,而是说明了我的问题的基础。

对于源 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>

我得到“Hello Word!”和“再见世界!”呈现粗体。如果我使用以下样式表:

   <?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 处理器遍历上下文中的节点并尝试为每个节点找到模板以匹配和执行。上下文是“当前节点”的同义词。我不明白的是:处理器是遍历当前节点的子节点(所以在我的示例中只有消息节点,因为它是文档节点的唯一子节点)还是遍历所有节点都是当前节点的后代?

【问题讨论】:

  • “我正在尝试了解 XSLT 1.0 的基本原理。我正在使用 Firefox 浏览器进行学习”:为什么不开始阅读解释它的书(例如 cranesoftwrights.github.io/books/ptux/index.htm)或查看在公共规范w3.org/TR/xslt-10/#section-Processing-Modelw3.org/TR/xslt-10/#built-in-rulew3.org/TR/xslt-10/#section-Applying-Template-Rules?
  • 老实说,来自 W3 的官方文档让我对使用术语“当前节点”没有定义它,但我当然应该阅读更多。至于 PTUX,谢谢,因为我不知道它,它看起来很有希望。
  • 您的第二组匹配两次问候,这实际上可能是一个错误。
  • 有很多教程和书籍试图解释它,为不同的受众设计了不同程度的形式。你不能指望 StackOverflow 上的个人教程,如果你得到一个,没有理由比其他许多人更好。请记住,在线资源通常是由一个人在几个小时内编写的,除了作者之外没有任何人审阅,而出版的书籍是在几个月内编写的,并且为了技术准确性和可读性,很多人都非常仔细地审阅。

标签: xml xslt


【解决方案1】:

要了解发生了什么,您应该查看作为 XSL 转换结果生成的 HTML 代码,而不是查看此代码在屏幕上的呈现方式。你得到:

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

第一行由匹配greeting* 的(最后一个)模板生成。第二行由built-in template rules 在没有匹配模板的情况下处理farewell 元素生成。这些模板将任何文本节点复制到输出。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多