【发布时间】: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-Model、w3.org/TR/xslt-10/#built-in-rule、w3.org/TR/xslt-10/#section-Applying-Template-Rules?
-
老实说,来自 W3 的官方文档让我对使用术语“当前节点”没有定义它,但我当然应该阅读更多。至于 PTUX,谢谢,因为我不知道它,它看起来很有希望。
-
您的第二组匹配两次问候,这实际上可能是一个错误。
-
有很多教程和书籍试图解释它,为不同的受众设计了不同程度的形式。你不能指望 StackOverflow 上的个人教程,如果你得到一个,没有理由比其他许多人更好。请记住,在线资源通常是由一个人在几个小时内编写的,除了作者之外没有任何人审阅,而出版的书籍是在几个月内编写的,并且为了技术准确性和可读性,很多人都非常仔细地审阅。